// 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.provide('goog.testing.fs.integrationTest'); goog.setTestOnly('goog.testing.fs.integrationTest'); goog.require('goog.async.Deferred'); goog.require('goog.async.DeferredList'); goog.require('goog.events'); goog.require('goog.fs'); goog.require('goog.fs.DirectoryEntry'); goog.require('goog.fs.Error'); goog.require('goog.fs.FileSaver'); goog.require('goog.testing.AsyncTestCase'); goog.require('goog.testing.PropertyReplacer'); goog.require('goog.testing.fs'); goog.require('goog.testing.jsunit'); var TEST_DIR = 'goog-fs-test-dir'; var deferredFs = goog.testing.fs.getTemporary(); var asyncTestCase = goog.testing.AsyncTestCase.createAndInstall(); function setUpPage() { goog.testing.fs.install(new goog.testing.PropertyReplacer()); } function tearDown() { loadTestDir(). addCallback(function(dir) { return dir.removeRecursively(); }). addBoth(continueTesting); asyncTestCase.waitForAsync('removing filesystem'); } function testWriteFile() { loadFile('test', goog.fs.DirectoryEntry.Behavior.CREATE). addCallback(goog.partial(writeToFile, 'test content')). addCallback(goog.partial(checkFileContent, 'test content')). addBoth(continueTesting); asyncTestCase.waitForAsync('testWriteFile'); } function testRemoveFile() { loadFile('test', goog.fs.DirectoryEntry.Behavior.CREATE). addCallback(goog.partial(writeToFile, 'test content')). addCallback(function(fileEntry) { return fileEntry.remove(); }). addCallback(goog.partial(checkFileRemoved, 'test')). addBoth(continueTesting); asyncTestCase.waitForAsync('testRemoveFile'); } function testMoveFile() { var deferredSubdir = loadDirectory( 'subdir', goog.fs.DirectoryEntry.Behavior.CREATE); var deferredWrittenFile = loadFile('test', goog.fs.DirectoryEntry.Behavior.CREATE). addCallback(goog.partial(writeToFile, 'test content')); goog.async.DeferredList.gatherResults([deferredSubdir, deferredWrittenFile]). addCallback(splitArgs(function(dir, fileEntry) { return fileEntry.moveTo(dir); })). addCallback(goog.partial(checkFileContent, 'test content')). addCallback(goog.partial(checkFileRemoved, 'test')). addBoth(continueTesting); asyncTestCase.waitForAsync('testMoveFile'); } function testCopyFile() { var deferredFile = loadFile('test', goog.fs.DirectoryEntry.Behavior.CREATE); var deferredSubdir = loadDirectory( 'subdir', goog.fs.DirectoryEntry.Behavior.CREATE); var deferredWrittenFile = deferredFile.branch(). addCallback(goog.partial(writeToFile, 'test content')); goog.async.DeferredList.gatherResults([deferredSubdir, deferredWrittenFile]). addCallback(splitArgs(function(dir, fileEntry) { return fileEntry.copyTo(dir); })). addCallback(goog.partial(checkFileContent, 'test content')). awaitDeferred(deferredFile). addCallback(goog.partial(checkFileContent, 'test content')). addBoth(continueTesting); asyncTestCase.waitForAsync('testCopyFile'); } function testAbortWrite() { var deferredFile = loadFile('test', goog.fs.DirectoryEntry.Behavior.CREATE); deferredFile.branch(). addCallback(goog.partial(startWrite, 'test content')). addCallback(function(writer) { writer.abort(); }). addCallback( goog.partial(waitForEvent, goog.fs.FileSaver.EventType.ABORT)). awaitDeferred(deferredFile). addCallback(goog.partial(checkFileContent, '')). addBoth(continueTesting); asyncTestCase.waitForAsync('testAbortWrite'); } function testSeek() { var deferredFile = loadFile('test', goog.fs.DirectoryEntry.Behavior.CREATE); deferredFile.branch(). addCallback(goog.partial(writeToFile, 'test content')). addCallback(function(fileEntry) { return fileEntry.createWriter(); }). addCallback( goog.partial(checkReadyState, goog.fs.FileSaver.ReadyState.INIT)). addCallback(function(writer) { writer.seek(5); writer.write(goog.fs.getBlob('stuff and things')); }). addCallback( goog.partial(checkReadyState, goog.fs.FileSaver.ReadyState.WRITING)). addCallback( goog.partial(waitForEvent, goog.fs.FileSaver.EventType.WRITE)). awaitDeferred(deferredFile). addCallback(goog.partial(checkFileContent, 'test stuff and things')). addBoth(continueTesting); asyncTestCase.waitForAsync('testSeek'); } function testTruncate() { var deferredFile = loadFile('test', goog.fs.DirectoryEntry.Behavior.CREATE); deferredFile.branch(). addCallback(goog.partial(writeToFile, 'test content')). addCallback(function(fileEntry) { return fileEntry.createWriter(); }). addCallback( goog.partial(checkReadyState, goog.fs.FileSaver.ReadyState.INIT)). addCallback(function(writer) { writer.truncate(4); }). addCallback( goog.partial(checkReadyState, goog.fs.FileSaver.ReadyState.WRITING)). addCallback( goog.partial(waitForEvent, goog.fs.FileSaver.EventType.WRITE)). awaitDeferred(deferredFile). addCallback(goog.partial(checkFileContent, 'test')). addBoth(continueTesting); asyncTestCase.waitForAsync('testTruncate'); } function continueTesting(result) { asyncTestCase.continueTesting(); if (result instanceof Error) { throw result; } } function loadTestDir() { return deferredFs.branch().addCallback(function(fs) { return fs.getRoot().getDirectory( TEST_DIR, goog.fs.DirectoryEntry.Behavior.CREATE); }); } function loadFile(filename, behavior) { return loadTestDir().addCallback(function(dir) { return dir.getFile(filename, behavior); }); } function loadDirectory(filename, behavior) { return loadTestDir().addCallback(function(dir) { return dir.getDirectory(filename, behavior); }); } function startWrite(content, fileEntry) { return fileEntry.createWriter(). addCallback( goog.partial(checkReadyState, goog.fs.FileSaver.ReadyState.INIT)). addCallback(function(writer) { writer.write(goog.fs.getBlob(content)); return writer; }). addCallback( goog.partial(checkReadyState, goog.fs.FileSaver.ReadyState.WRITING)); } function waitForEvent(type, target) { var d = new goog.async.Deferred(); goog.events.listenOnce(target, type, d.callback, false, d); return d; } function writeToFile(content, fileEntry) { return startWrite(content, fileEntry). addCallback( goog.partial(waitForEvent, goog.fs.FileSaver.EventType.WRITE)). addCallback(function() { return fileEntry; }); } function checkFileContent(content, fileEntry) { return fileEntry.file(). addCallback(function(blob) { return goog.fs.blobToString(blob); }). addCallback(goog.partial(assertEquals, content)); } function checkFileRemoved(filename) { return loadFile(filename). addCallback(goog.partial(fail, 'expected file to be removed')). addErrback(function(err) { assertEquals(err.code, goog.fs.Error.ErrorCode.NOT_FOUND); return true; // Go back to callback path }); } function checkReadyState(expectedState, writer) { assertEquals(expectedState, writer.getReadyState()); } function splitArgs(fn) { return function(args) { return fn(args[0], args[1]); }; }