async = require 'async' {spawn, exec} = require 'child_process' fs = require 'fs' log = console.log remove = require 'remove' # Node 0.6 compatibility hack. unless fs.existsSync path = require 'path' fs.existsSync = (filePath) -> path.existsSync filePath task 'build', -> build() task 'test', -> vendor -> build -> ssl_cert -> tokens -> run 'node_modules/mocha/bin/mocha --colors --slow 200 ' + '--timeout 10000 --require test/js/helper.js test/js/*test.js' task 'webtest', -> vendor -> build -> ssl_cert -> tokens -> webFileServer = require './test/js/web_file_server.js' webFileServer.openBrowser() task 'cert', -> remove.removeSync 'test/ssl', ignoreMissing: true ssl_cert() task 'vendor', -> remove.removeSync './test/vendor', ignoreMissing: true vendor() task 'tokens', -> remove.removeSync './test/.token', ignoreMissing: true build -> tokens -> process.exit 0 task 'doc', -> run 'node_modules/codo/bin/codo src' task 'extension', -> run 'node_modules/coffee-script/bin/coffee ' + '--compile test/chrome_extension/*.coffee' build = (callback) -> commands = [] # Compile without --join for decent error messages. commands.push 'node_modules/coffee-script/bin/coffee --output tmp ' + '--compile src/*.coffee' commands.push 'node_modules/coffee-script/bin/coffee --output lib ' + '--compile --join dropbox.js src/*.coffee' # Minify the javascript, for browser distribution. commands.push 'node_modules/uglify-js/bin/uglifyjs --compress --mangle ' + '--output lib/dropbox.min.js lib/dropbox.js' commands.push 'node_modules/coffee-script/bin/coffee --output test/js ' + '--compile test/src/*.coffee' async.forEachSeries commands, run, -> callback() if callback ssl_cert = (callback) -> fs.mkdirSync 'test/ssl' unless fs.existsSync 'test/ssl' if fs.existsSync 'test/ssl/cert.pem' callback() if callback? return run 'openssl req -new -x509 -days 365 -nodes -batch ' + '-out test/ssl/cert.pem -keyout test/ssl/cert.pem ' + '-subj /O=dropbox.js/OU=Testing/CN=localhost ', callback vendor = (callback) -> # All the files will be dumped here. fs.mkdirSync 'test/vendor' unless fs.existsSync 'test/vendor' # Embed the binary test image into a 7-bit ASCII JavaScript. bytes = fs.readFileSync 'test/binary/dropbox.png' fragments = [] for i in [0...bytes.length] fragment = bytes.readUInt8(i).toString 16 while fragment.length < 4 fragment = '0' + fragment fragments.push "\\u#{fragment}" js = "window.testImageBytes = \"#{fragments.join('')}\";" fs.writeFileSync 'test/vendor/favicon.js', js downloads = [ # chai.js ships different builds for browsers vs node.js ['http://chaijs.com/chai.js', 'test/vendor/chai.js'], # sinon.js also ships special builds for browsers ['http://sinonjs.org/releases/sinon.js', 'test/vendor/sinon.js'], # ... and sinon.js ships an IE-only module ['http://sinonjs.org/releases/sinon-ie.js', 'test/vendor/sinon-ie.js'] ] async.forEachSeries downloads, download, -> callback() if callback tokens = (callback) -> TokenStash = require './test/js/token_stash.js' tokenStash = new TokenStash (new TokenStash()).get -> callback() if callback? run = (args...) -> for a in args switch typeof a when 'string' then command = a when 'object' if a instanceof Array then params = a else options = a when 'function' then callback = a command += ' ' + params.join ' ' if params? cmd = spawn '/bin/sh', ['-c', command], options cmd.stdout.on 'data', (data) -> process.stdout.write data cmd.stderr.on 'data', (data) -> process.stderr.write data process.on 'SIGHUP', -> cmd.kill() cmd.on 'exit', (code) -> callback() if callback? and code is 0 download = ([url, file], callback) -> if fs.existsSync file callback() if callback? return run "curl -o #{file} #{url}", callback