266 lines
7.1 KiB
JavaScript
266 lines
7.1 KiB
JavaScript
// Copyright 2006 The Closure Library Authors. All Rights Reserved.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS-IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
goog.provide('goog.net.cookiesTest');
|
|
goog.setTestOnly('goog.net.cookiesTest');
|
|
|
|
goog.require('goog.array');
|
|
goog.require('goog.net.cookies');
|
|
goog.require('goog.testing.PropertyReplacer');
|
|
goog.require('goog.testing.jsunit');
|
|
|
|
var cookies = goog.net.cookies;
|
|
var baseCount = 0;
|
|
var stubs = new goog.testing.PropertyReplacer();
|
|
|
|
function checkForCookies() {
|
|
if (!cookies.isEnabled()) {
|
|
var message = 'Cookies must be enabled to run this test.';
|
|
if (location.protocol == 'file:') {
|
|
message += '\nNote that cookies for local files are disabled in some ' +
|
|
'browsers.\nThey can be enabled in Chrome with the ' +
|
|
'--enable-file-cookies flag.';
|
|
}
|
|
|
|
fail(message);
|
|
}
|
|
}
|
|
|
|
function setUp() {
|
|
checkForCookies();
|
|
|
|
// Make sure there are no cookies set by previous, bad tests.
|
|
cookies.clear();
|
|
baseCount = cookies.getCount();
|
|
}
|
|
|
|
function tearDown() {
|
|
// Clear up after ourselves.
|
|
cookies.clear();
|
|
stubs.reset();
|
|
}
|
|
|
|
function testIsEnabled() {
|
|
assertEquals(navigator.cookieEnabled, cookies.isEnabled());
|
|
}
|
|
|
|
function testCount() {
|
|
// setUp empties the cookies
|
|
|
|
cookies.set('testa', 'A');
|
|
assertEquals(baseCount + 1, cookies.getCount());
|
|
cookies.set('testb', 'B');
|
|
cookies.set('testc', 'C');
|
|
assertEquals(baseCount + 3, cookies.getCount());
|
|
cookies.remove('testa');
|
|
cookies.remove('testb');
|
|
assertEquals(baseCount + 1, cookies.getCount());
|
|
cookies.remove('testc');
|
|
assertEquals(baseCount + 0, cookies.getCount());
|
|
}
|
|
|
|
function testSet() {
|
|
cookies.set('testa', 'testb');
|
|
assertEquals('testb', cookies.get('testa'));
|
|
cookies.remove('testa');
|
|
assertEquals(undefined, cookies.get('testa'));
|
|
// check for invalid characters in name and value
|
|
}
|
|
|
|
function testGetKeys() {
|
|
cookies.set('testa', 'A');
|
|
cookies.set('testb', 'B');
|
|
cookies.set('testc', 'C');
|
|
var keys = cookies.getKeys();
|
|
assertTrue(goog.array.contains(keys, 'testa'));
|
|
assertTrue(goog.array.contains(keys, 'testb'));
|
|
assertTrue(goog.array.contains(keys, 'testc'));
|
|
}
|
|
|
|
|
|
function testGetValues() {
|
|
cookies.set('testa', 'A');
|
|
cookies.set('testb', 'B');
|
|
cookies.set('testc', 'C');
|
|
var values = cookies.getValues();
|
|
assertTrue(goog.array.contains(values, 'A'));
|
|
assertTrue(goog.array.contains(values, 'B'));
|
|
assertTrue(goog.array.contains(values, 'C'));
|
|
}
|
|
|
|
|
|
function testContainsKey() {
|
|
assertFalse(cookies.containsKey('testa'));
|
|
cookies.set('testa', 'A');
|
|
assertTrue(cookies.containsKey('testa'));
|
|
cookies.set('testb', 'B');
|
|
assertTrue(cookies.containsKey('testb'));
|
|
cookies.remove('testb');
|
|
assertFalse(cookies.containsKey('testb'));
|
|
cookies.remove('testa');
|
|
assertFalse(cookies.containsKey('testa'));
|
|
}
|
|
|
|
|
|
function testContainsValue() {
|
|
assertFalse(cookies.containsValue('A'));
|
|
cookies.set('testa', 'A');
|
|
assertTrue(cookies.containsValue('A'));
|
|
cookies.set('testb', 'B');
|
|
assertTrue(cookies.containsValue('B'));
|
|
cookies.remove('testb');
|
|
assertFalse(cookies.containsValue('B'));
|
|
cookies.remove('testa');
|
|
assertFalse(cookies.containsValue('A'));
|
|
}
|
|
|
|
|
|
function testIsEmpty() {
|
|
// we cannot guarantee that we have no cookies so testing for the true
|
|
// case cannot be done without a mock document.cookie
|
|
cookies.set('testa', 'A');
|
|
assertFalse(cookies.isEmpty());
|
|
cookies.set('testb', 'B');
|
|
assertFalse(cookies.isEmpty());
|
|
cookies.remove('testb');
|
|
assertFalse(cookies.isEmpty());
|
|
cookies.remove('testa');
|
|
}
|
|
|
|
|
|
function testRemove() {
|
|
assertFalse(
|
|
'1. Cookie should not contain "testa"', cookies.containsKey('testa'));
|
|
cookies.set('testa', 'A', undefined, '/');
|
|
assertTrue('2. Cookie should contain "testa"', cookies.containsKey('testa'));
|
|
cookies.remove('testa', '/');
|
|
assertFalse(
|
|
'3. Cookie should not contain "testa"', cookies.containsKey('testa'));
|
|
|
|
cookies.set('testa', 'A');
|
|
assertTrue('4. Cookie should contain "testa"', cookies.containsKey('testa'));
|
|
cookies.remove('testa');
|
|
assertFalse(
|
|
'5. Cookie should not contain "testa"', cookies.containsKey('testa'));
|
|
}
|
|
|
|
function testStrangeValue() {
|
|
// This ensures that the pattern key2=value in the value does not match
|
|
// the key2 cookie.
|
|
var value = 'testb=bbb';
|
|
var value2 = 'ccc';
|
|
|
|
cookies.set('testa', value);
|
|
cookies.set('testb', value2);
|
|
|
|
assertEquals(value, cookies.get('testa'));
|
|
assertEquals(value2, cookies.get('testb'));
|
|
}
|
|
|
|
function testSetCookiePath() {
|
|
assertEquals('foo=bar;path=/xyz',
|
|
mockSetCookie('foo', 'bar', -1, '/xyz'));
|
|
}
|
|
|
|
function testSetCookieDomain() {
|
|
assertEquals('foo=bar;domain=google.com',
|
|
mockSetCookie('foo', 'bar', -1, null, 'google.com'));
|
|
}
|
|
|
|
function testSetCookieSecure() {
|
|
assertEquals('foo=bar;secure',
|
|
mockSetCookie('foo', 'bar', -1, null, null, true));
|
|
}
|
|
|
|
function testSetCookieMaxAgeZero() {
|
|
var result = mockSetCookie('foo', 'bar', 0);
|
|
var pattern = new RegExp(
|
|
'foo=bar;expires=' + new Date(1970, 1, 1).toUTCString());
|
|
if (!result.match(pattern)) {
|
|
fail('expected match against ' + pattern + ' got ' + result);
|
|
}
|
|
}
|
|
|
|
function testGetEmptyCookie() {
|
|
var value = '';
|
|
|
|
cookies.set('test', value);
|
|
|
|
assertEquals(value, cookies.get('test'));
|
|
}
|
|
|
|
function testGetEmptyCookieIE() {
|
|
stubs.set(cookies, 'getCookie_', function() {
|
|
return 'test1; test2; test3';
|
|
});
|
|
|
|
assertEquals('', cookies.get('test1'));
|
|
assertEquals('', cookies.get('test2'));
|
|
assertEquals('', cookies.get('test3'));
|
|
}
|
|
|
|
// TODO(chrisn): Testing max age > 0 requires a mock clock.
|
|
|
|
function mockSetCookie(var_args) {
|
|
var setCookie = cookies.setCookie_;
|
|
try {
|
|
var result;
|
|
cookies.setCookie_ = function(arg) {
|
|
result = arg;
|
|
};
|
|
cookies.set.apply(cookies, arguments);
|
|
return result;
|
|
} finally {
|
|
cookies.setCookie_ = setCookie;
|
|
}
|
|
}
|
|
|
|
function assertValidName(name) {
|
|
assertTrue(name + ' should be valid', cookies.isValidName(name));
|
|
}
|
|
|
|
function assertInvalidName(name) {
|
|
assertFalse(name + ' should be invalid', cookies.isValidName(name));
|
|
assertThrows(function() {
|
|
cookies.set(name, 'value');
|
|
});
|
|
}
|
|
|
|
function assertValidValue(val) {
|
|
assertTrue(val + ' should be valid', cookies.isValidValue(val));
|
|
}
|
|
|
|
function assertInvalidValue(val) {
|
|
assertFalse(val + ' should be invalid', cookies.isValidValue(val));
|
|
assertThrows(function() {
|
|
cookies.set('name', val);
|
|
});
|
|
}
|
|
|
|
function testValidName() {
|
|
assertValidName('foo');
|
|
assertInvalidName('foo bar');
|
|
assertInvalidName('foo=bar');
|
|
assertInvalidName('foo;bar');
|
|
assertInvalidName('foo\nbar');
|
|
}
|
|
|
|
function testValidValue() {
|
|
assertValidValue('foo');
|
|
assertValidValue('foo bar');
|
|
assertValidValue('foo=bar');
|
|
assertInvalidValue('foo;bar');
|
|
assertInvalidValue('foo\nbar');
|
|
}
|