Do not announce robot account token before account ID is available
[chromium-blink-merge.git] / chrome / test / data / webui / net_internals / hsts_view.js
blobac8c1965d4dd359aaca1262c437e68cd33a57636
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 // Include test fixture.
6 GEN_INCLUDE(['net_internals_test.js']);
8 // Anonymous namespace
9 (function() {
12  * A valid hash that can be set for a domain.
13  * @type {string}
14  */
15 var VALID_HASH = 'sha1/Guzek9lMwR3KeIS8wwS9gBvVtIg=';
18  * An invalid hash that can't be set for a domain.
19  * @type {string}
20  */
21 var INVALID_HASH = 'invalid';
24  * Possible results of an HSTS query.
25  * @enum {number}
26  */
27 var QueryResultType = {
28   SUCCESS: 0,
29   NOT_FOUND: 1,
30   ERROR: 2
33 /**
34  * A Task that waits for the results of an HSTS query.  Once the results are
35  * received, checks them before completing.  Does not initiate the query.
36  * @param {string} domain The domain expected in the returned results.
37  * @param {bool} stsSubdomains Whether or not the stsSubdomains flag is expected
38  *     to be set in the returned results.  Ignored on error and not found
39  *     results.
40  * @param {bool} pkpSubdomains Whether or not the pkpSubdomains flag is expected
41  *     to be set in the returned results.  Ignored on error and not found
42  *     results.
43  * @param {number} stsObserved The time the STS policy was observed.
44  * @param {number} pkpObserved The time the PKP policy was observed.
45  * @param {string} publicKeyHashes Expected public key hashes.  Ignored on error
46  *     error and not found results.
47  * @param {QueryResultType} queryResultType The expected result type of the
48  *     results of the query.
49  * @extends {NetInternalsTest.Task}
50  */
51 function CheckQueryResultTask(domain, stsSubdomains, pkpSubdomains,
52                               stsObserved, pkpObserved, publicKeyHashes,
53                               queryResultType) {
54   this.domain_ = domain;
55   this.stsSubdomains_ = stsSubdomains;
56   this.pkpSubdomains_ = pkpSubdomains;
57   this.stsObserved_ = stsObserved;
58   this.pkpObserved_ = pkpObserved;
59   this.publicKeyHashes_ = publicKeyHashes;
60   this.queryResultType_ = queryResultType;
61   NetInternalsTest.Task.call(this);
64 CheckQueryResultTask.prototype = {
65   __proto__: NetInternalsTest.Task.prototype,
67   /**
68    * Starts watching for the query results.
69    */
70   start: function() {
71     g_browser.addHSTSObserver(this);
72   },
74   /**
75    * Callback from the BrowserBridge.  Validates |result| and completes the
76    * task.
77    * @param {object} result Results from the query.
78    */
79   onHSTSQueryResult: function(result) {
80     // Ignore results after |this| is finished.
81     if (!this.isDone()) {
82       expectEquals(this.domain_, $(HSTSView.QUERY_INPUT_ID).value);
84       // Each case has its own validation function because of the design of the
85       // test reporting infrastructure.
86       if (result.error != undefined) {
87         this.checkError_(result);
88       } else if (!result.result) {
89         this.checkNotFound_(result);
90       } else {
91         this.checkSuccess_(result);
92       }
93       this.running_ = false;
95       // Start the next task asynchronously, so it can add another HSTS observer
96       // without getting the current result.
97       window.setTimeout(this.onTaskDone.bind(this), 1);
98     }
99   },
101   /**
102    * On errors, checks the result.
103    * @param {object} result Results from the query.
104    */
105   checkError_: function(result) {
106     expectEquals(QueryResultType.ERROR, this.queryResultType_);
107     expectEquals(result.error, $(HSTSView.QUERY_OUTPUT_DIV_ID).innerText);
108   },
110   /**
111    * Checks the result when the entry was not found.
112    * @param {object} result Results from the query.
113    */
114   checkNotFound_: function(result) {
115     expectEquals(QueryResultType.NOT_FOUND, this.queryResultType_);
116     expectEquals('Not found', $(HSTSView.QUERY_OUTPUT_DIV_ID).innerText);
117   },
119   /**
120    * Checks successful results.
121    * @param {object} result Results from the query.
122    */
123   checkSuccess_: function(result) {
124     expectEquals(QueryResultType.SUCCESS, this.queryResultType_);
125     expectEquals(this.stsSubdomains_, result.dynamic_sts_include_subdomains);
126     expectEquals(this.pkpSubdomains_, result.dynamic_pkp_include_subdomains);
127     // Disabled because of http://crbug.com/397639
128     // expectLE(this.stsObserved_, result.dynamic_sts_observed);
129     // expectLE(this.pkpObserved_, result.dynamic_pkp_observed);
131     // |public_key_hashes| is an old synonym for what is now
132     // |preloaded_spki_hashes|, which in turn is a legacy synonym for
133     // |static_spki_hashes|. Look for all three, and also for
134     // |dynamic_spki_hashes|.
135     if (typeof result.public_key_hashes === 'undefined')
136       result.public_key_hashes = '';
137     if (typeof result.preloaded_spki_hashes === 'undefined')
138       result.preloaded_spki_hashes = '';
139     if (typeof result.static_spki_hashes === 'undefined')
140       result.static_spki_hashes = '';
141     if (typeof result.dynamic_spki_hashes === 'undefined')
142       result.dynamic_spki_hashes = '';
144     var hashes = [];
145     if (result.public_key_hashes)
146       hashes.push(result.public_key_hashes);
147     if (result.preloaded_spki_hashes)
148       hashes.push(result.preloaded_spki_hashes);
149     if (result.static_spki_hashes)
150       hashes.push(result.static_spki_hashes);
151     if (result.dynamic_spki_hashes)
152       hashes.push(result.dynamic_spki_hashes);
154     expectEquals(this.publicKeyHashes_, hashes.join(','));
156     // Verify that the domain appears somewhere in the displayed text.
157     outputText = $(HSTSView.QUERY_OUTPUT_DIV_ID).innerText;
158     expectLE(0, outputText.search(this.domain_));
159   }
163  * A Task to try and add an HSTS domain via the HTML form.  The task will wait
164  * until the results from the automatically sent query have been received, and
165  * then checks them against the expected values.
166  * @param {string} domain The domain to send and expected to be returned.
167  * @param {bool} stsSubdomains Whether the HSTS subdomain checkbox should be
168  *     selected. Also the corresponding expected return value, in the success
169  *     case.
170  * @param {bool} pkpSubdomains Whether the pinning subdomain checkbox should be
171  *     selected. Also the corresponding expected return value, in the success
172  *     case. When publicKeyHashes is INVALID_HASH, the expected return value
173  *     is false.
174  * @param {number} stsObserved The time the STS policy was observed.
175  * @param {number} pkpObserved The time the PKP policy was observed.
176  * @param {string} publicKeyHashes Public key hash to send.  Also the
177  *     corresponding expected return value, on success.  When this is the string
178  *     INVALID_HASH, an empty string is expected to be received instead.
179  * @param {QueryResultType} queryResultType Expected result type.
180  * @extends {CheckQueryResultTask}
181  */
182 function AddTask(domain, stsSubdomains, pkpSubdomains, publicKeyHashes,
183                  stsObserved, pkpObserved, queryResultType) {
184   this.requestedPublicKeyHashes_ = publicKeyHashes;
185   this.requestedPkpSubdomains_ = pkpSubdomains;
186   if (publicKeyHashes == INVALID_HASH) {
187     pkpSubdomains = false;
188     publicKeyHashes = '';
189   }
190   CheckQueryResultTask.call(this, domain, stsSubdomains, pkpSubdomains,
191                             stsObserved, pkpObserved, publicKeyHashes,
192                             queryResultType);
195 AddTask.prototype = {
196   __proto__: CheckQueryResultTask.prototype,
198   /**
199    * Fills out the add form, simulates a click to submit it, and starts
200    * listening for the results of the query that is automatically submitted.
201    */
202   start: function() {
203     $(HSTSView.ADD_INPUT_ID).value = this.domain_;
204     $(HSTSView.ADD_STS_CHECK_ID).checked = this.stsSubdomains_;
205     $(HSTSView.ADD_PKP_CHECK_ID).checked = this.requestedPkpSubdomains_;
206     $(HSTSView.ADD_PINS_ID).value = this.requestedPublicKeyHashes_;
207     $(HSTSView.ADD_SUBMIT_ID).click();
208     CheckQueryResultTask.prototype.start.call(this);
209   }
213  * A Task to query a domain and wait for the results.  Parameters mirror those
214  * of CheckQueryResultTask, except |domain| is also the name of the domain to
215  * query.
216  * @extends {CheckQueryResultTask}
217  */
218 function QueryTask(domain, stsSubdomains, pkpSubdomains, stsObserved,
219                    pkpObserved, publicKeyHashes, queryResultType) {
220   CheckQueryResultTask.call(this, domain, stsSubdomains, pkpSubdomains,
221                             stsObserved, pkpObserved, publicKeyHashes,
222                             queryResultType);
225 QueryTask.prototype = {
226   __proto__: CheckQueryResultTask.prototype,
228   /**
229    * Fills out the query form, simulates a click to submit it, and starts
230    * listening for the results.
231    */
232   start: function() {
233     CheckQueryResultTask.prototype.start.call(this);
234     $(HSTSView.QUERY_INPUT_ID).value = this.domain_;
235     $(HSTSView.QUERY_SUBMIT_ID).click();
236   }
240  * Task that deletes a single domain, then queries the deleted domain to make
241  * sure it's gone.
242  * @param {string} domain The domain to delete.
243  * @param {QueryResultType} queryResultType The result of the query.  Can be
244  *     QueryResultType.ERROR or QueryResultType.NOT_FOUND.
245  * @extends {QueryTask}
246  */
247 function DeleteTask(domain, queryResultType) {
248   expectNotEquals(queryResultType, QueryResultType.SUCCESS);
249   this.domain_ = domain;
250   QueryTask.call(this, domain, false, false, '', 0, 0, queryResultType);
253 DeleteTask.prototype = {
254   __proto__: QueryTask.prototype,
256   /**
257    * Fills out the delete form and simulates a click to submit it.  Then sends
258    * a query.
259    */
260   start: function() {
261     $(HSTSView.DELETE_INPUT_ID).value = this.domain_;
262     $(HSTSView.DELETE_SUBMIT_ID).click();
263     QueryTask.prototype.start.call(this);
264   }
268  * Checks that querying a domain that was never added fails.
269  */
270 TEST_F('NetInternalsTest', 'netInternalsHSTSViewQueryNotFound', function() {
271   NetInternalsTest.switchToView('hsts');
272   taskQueue = new NetInternalsTest.TaskQueue(true);
273   var now = new Date().getTime() / 1000.0;
274   taskQueue.addTask(new QueryTask('somewhere.com', false, false, now, now, '',
275                                   QueryResultType.NOT_FOUND));
276   taskQueue.run();
280  * Checks that querying a domain with an invalid name returns an error.
281  */
282 TEST_F('NetInternalsTest', 'netInternalsHSTSViewQueryError', function() {
283   NetInternalsTest.switchToView('hsts');
284   taskQueue = new NetInternalsTest.TaskQueue(true);
285   var now = new Date().getTime() / 1000.0;
286   taskQueue.addTask(new QueryTask('\u3024', false, false, now, now, '',
287                                   QueryResultType.ERROR));
288   taskQueue.run();
292  * Deletes a domain that was never added.
293  */
294 TEST_F('NetInternalsTest', 'netInternalsHSTSViewDeleteNotFound', function() {
295   NetInternalsTest.switchToView('hsts');
296   taskQueue = new NetInternalsTest.TaskQueue(true);
297   taskQueue.addTask(new DeleteTask('somewhere.com', QueryResultType.NOT_FOUND));
298   taskQueue.run();
302  * Deletes a domain that returns an error on lookup.
303  */
304 TEST_F('NetInternalsTest', 'netInternalsHSTSViewDeleteError', function() {
305   NetInternalsTest.switchToView('hsts');
306   taskQueue = new NetInternalsTest.TaskQueue(true);
307   taskQueue.addTask(new DeleteTask('\u3024', QueryResultType.ERROR));
308   taskQueue.run();
312  * Adds a domain and then deletes it.
313  */
314 TEST_F('NetInternalsTest', 'netInternalsHSTSViewAddDelete', function() {
315   NetInternalsTest.switchToView('hsts');
316   taskQueue = new NetInternalsTest.TaskQueue(true);
317   var now = new Date().getTime() / 1000.0;
318   taskQueue.addTask(new AddTask('somewhere.com', false, false, VALID_HASH,
319                                 now, now, QueryResultType.SUCCESS));
320   taskQueue.addTask(new DeleteTask('somewhere.com', QueryResultType.NOT_FOUND));
321   taskQueue.run();
325  * Tries to add a domain with an invalid name.
326  */
327 TEST_F('NetInternalsTest', 'netInternalsHSTSViewAddFail', function() {
328   NetInternalsTest.switchToView('hsts');
329   taskQueue = new NetInternalsTest.TaskQueue(true);
330   var now = new Date().getTime() / 1000.0;
331   taskQueue.addTask(new AddTask('0123456789012345678901234567890' +
332                                 '012345678901234567890123456789012345',
333                                 false, false, '', now, now,
334                                 QueryResultType.NOT_FOUND));
335   taskQueue.run();
339  * Tries to add a domain with a name that errors out on lookup due to having
340  * non-ASCII characters in it.
341  */
342 TEST_F('NetInternalsTest', 'netInternalsHSTSViewAddError', function() {
343   NetInternalsTest.switchToView('hsts');
344   taskQueue = new NetInternalsTest.TaskQueue(true);
345   var now = new Date().getTime() / 1000.0;
346   taskQueue.addTask(new AddTask('\u3024', false, false, '', now, now,
347                                 QueryResultType.ERROR));
348   taskQueue.run();
352  * Adds a domain with an invalid hash.
353  */
354 TEST_F('NetInternalsTest', 'netInternalsHSTSViewAddInvalidHash', function() {
355   NetInternalsTest.switchToView('hsts');
356   taskQueue = new NetInternalsTest.TaskQueue(true);
357   var now = new Date().getTime() / 1000.0;
358   taskQueue.addTask(new AddTask('somewhere.com', true, true, INVALID_HASH,
359                                 now, now, QueryResultType.SUCCESS));
360   taskQueue.addTask(new DeleteTask('somewhere.com', QueryResultType.NOT_FOUND));
361   taskQueue.run();
365  * Adds the same domain twice in a row, modifying some values the second time.
366  */
367 TEST_F('NetInternalsTest', 'netInternalsHSTSViewAddOverwrite', function() {
368   NetInternalsTest.switchToView('hsts');
369   taskQueue = new NetInternalsTest.TaskQueue(true);
370   var now = new Date().getTime() / 1000.0;
371   taskQueue.addTask(new AddTask('somewhere.com', true, true, VALID_HASH,
372                                 now, now, QueryResultType.SUCCESS));
373   taskQueue.addTask(new AddTask('somewhere.com', false, false, '',
374                                 now, now, QueryResultType.SUCCESS));
375   taskQueue.addTask(new DeleteTask('somewhere.com', QueryResultType.NOT_FOUND));
376   taskQueue.run();
380  * Adds two different domains and then deletes them.
381  */
382 TEST_F('NetInternalsTest', 'netInternalsHSTSViewAddTwice', function() {
383   NetInternalsTest.switchToView('hsts');
384   taskQueue = new NetInternalsTest.TaskQueue(true);
385   var now = new Date().getTime() / 1000.0;
386   taskQueue.addTask(new AddTask('somewhere.com', false, false, VALID_HASH,
387                                 now, now, QueryResultType.SUCCESS));
388   taskQueue.addTask(new QueryTask('somewhereelse.com', false, false, now, now,
389                                   '', QueryResultType.NOT_FOUND));
390   taskQueue.addTask(new AddTask('somewhereelse.com', true, false, '',
391                                 now, now, QueryResultType.SUCCESS));
392   taskQueue.addTask(new QueryTask('somewhere.com', false, false, now, now,
393                                   VALID_HASH, QueryResultType.SUCCESS));
394   taskQueue.addTask(new DeleteTask('somewhere.com', QueryResultType.NOT_FOUND));
395   taskQueue.addTask(new QueryTask('somewhereelse.com', true, false, now, now,
396                                   '', QueryResultType.SUCCESS));
397   taskQueue.addTask(new DeleteTask('somewhereelse.com',
398                                    QueryResultType.NOT_FOUND));
399   taskQueue.run(true);
402 })();  // Anonymous namespace