blob: 239478facb6259b185c7ac174fba12d3d3871d16 [file] [log] [blame]
// Copyright 2011 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.setTestOnly('goog.storage.mechanism.HTML5WebStorageTest');
goog.provide('goog.storage.mechanism.HTML5MockStorage');
goog.provide('goog.storage.mechanism.HTML5WebStorageTest');
goog.provide('goog.storage.mechanism.MockThrowableStorage');
goog.require('goog.storage.mechanism.ErrorCode');
goog.require('goog.storage.mechanism.HTML5WebStorage');
goog.require('goog.testing.jsunit');
/**
* A minimal WebStorage implementation that throws exceptions for disabled
* storage. Since we cannot have unit tests running in Safari private mode to
* test this, we need to mock an exception throwing when trying to set a value.
*
* @param {boolean=} opt_isStorageDisabled If true, throws exceptions emulating
* Private browsing mode. If false, storage quota will be marked as
* exceeded.
* @constructor
*/
goog.storage.mechanism.MockThrowableStorage = function(opt_isStorageDisabled) {
this.isStorageDisabled_ = !!opt_isStorageDisabled;
this.length = opt_isStorageDisabled ? 0 : 1;
};
/** @override */
goog.storage.mechanism.MockThrowableStorage.prototype.setItem =
function(key, value) {
if (this.isStorageDisabled_) {
throw goog.storage.mechanism.ErrorCode.STORAGE_DISABLED;
} else {
throw goog.storage.mechanism.ErrorCode.QUOTA_EXCEEDED;
}
};
/** @override */
goog.storage.mechanism.MockThrowableStorage.prototype.removeItem =
function(key) {};
/**
* A very simple, dummy implementation of key(), merely to verify that calls to
* HTML5WebStorage#key are proxied through.
* @param {number} index A key index.
* @return {string} The key associated with that index.
*/
goog.storage.mechanism.MockThrowableStorage.prototype.key = function(index) {
return 'dummyKey';
};
/**
* Provides an HTML5WebStorage wrapper for MockThrowableStorage.
*
* @constructor
* @extends {goog.storage.mechanism.HTML5WebStorage}
*/
goog.storage.mechanism.HTML5MockStorage = function(opt_isStorageDisabled) {
goog.base(
this,
new goog.storage.mechanism.MockThrowableStorage(opt_isStorageDisabled));
};
goog.inherits(goog.storage.mechanism.HTML5MockStorage,
goog.storage.mechanism.HTML5WebStorage);
function testIsNotAvailableWhenQuotaExceeded() {
var storage = new goog.storage.mechanism.HTML5MockStorage(false);
assertFalse(storage.isAvailable());
}
function testIsNotAvailableWhenStorageDisabled() {
var storage = new goog.storage.mechanism.HTML5MockStorage(true);
assertFalse(storage.isAvailable());
}
function testSetThrowsExceptionWhenQuotaExceeded() {
var storage = new goog.storage.mechanism.HTML5MockStorage(false);
var isQuotaExceeded = false;
try {
storage.set('foobar', '1');
} catch (e) {
isQuotaExceeded = e == goog.storage.mechanism.ErrorCode.QUOTA_EXCEEDED;
}
assertTrue(isQuotaExceeded);
}
function testSetThrowsExceptionWhenStorageDisabled() {
var storage = new goog.storage.mechanism.HTML5MockStorage(true);
var isStorageDisabled = false;
try {
storage.set('foobar', '1');
} catch (e) {
isStorageDisabled = e == goog.storage.mechanism.ErrorCode.STORAGE_DISABLED;
}
assertTrue(isStorageDisabled);
}
function testKeyIterationWithKeyMethod() {
var storage = new goog.storage.mechanism.HTML5MockStorage(true);
assertEquals('dummyKey', storage.key(1));
}