var common = require("../common"); var path = require("path"); var assert = common.assert; var bigFile = path.join(common.tmpDir, "bigFile"); var fs = require("fs"); var cp = require("child_process"); console.error("Note: This test requires the dd, base64, and shasum programs."); fs.stat(bigFile, function (er, s) { if (er || s.size < 1024*1024*128) { makeBigFile(); } else { doEncoding(); } }) function makeBigFile () { console.error("making bigFile"); // write 128mb of zeros to bigFile cp.exec("dd if=/dev/zero of="+bigFile+" bs=134217728 count=1", function (er) { if (er) { console.error("Failed to create "+bigFile); throw er; } doEncoding(); }); } function doEncoding () { // encode with node. console.error("doing encoding"); fs.readFile(bigFile, function (er, data) { if (er) throw er; var b64 = new Buffer(data.toString("base64")); fs.writeFile(bigFile+"-enc-node", b64, encDone); }); // encode with base64 cp.exec("base64 <"+bigFile+" >"+bigFile+"-enc-native", encDone); var encCalls = 2; function encDone (er) { if (er) { console.error("failed to encode"); throw er; } if (-- encCalls > 0) return; doDecoding() } } function doDecoding () { console.error("doing decoding"); // decode both files both ways decodeNode( bigFile+"-enc-node" , decDone); decodeNode( bigFile+"-enc-native", decDone); decodeNative(bigFile+"-enc-node" , decDone); decodeNative(bigFile+"-enc-native", decDone); var decCalls = 4; function decDone (er) { if (er) { console.error("failed to decode"); throw er; } if (-- decCalls > 0) return; doShasum(); } } function decodeNode (f, cb) { // decode with node. console.error("decode "+path.basename(f)+" with node"); fs.readFile(f, function (er, data) { if (er) throw er; var dec = new Buffer(data.toString(), "base64"); fs.writeFile(f+"-dec-node", dec, cb); }); } function decodeNative (f, cb) { console.error("decode "+path.basename(f)+" natively"); cp.exec("base64 -d <"+f+" >"+f+"-dec-native", cb); } // check the shasums of all decoded files match the original. function doShasum () { console.error("do shasums"); // make sure to get the original first. shaFile(bigFile, function (file, out) { checkSha(file, out); shaFile(bigFile+"-enc-node-dec-node" , checkSha); shaFile(bigFile+"-enc-native-dec-node" , checkSha); shaFile(bigFile+"-enc-node-dec-native" , checkSha); shaFile(bigFile+"-enc-native-dec-native", checkSha); }); } function shaFile (file, cb) { console.error("shasum "+path.basename(file)); cp.exec("shasum "+file, function (er, out) { if (er) { console.error("failed to shasum "+path.basename(file)); throw er; } cb(file, out); }); } var sha = null; var fail = null; var checks = 5; function checkSha (file, out) { var s = out.toString().match(/^([a-fA-F0-9]{40})/); if (!s) { console.error("bad sha: "+out); throw new Error("fail"); } s = s[0]; console.error(s+" "+path.basename(file)); if (sha === null) { sha = s; } else { // assert.equal(sha, s, file+" doesn't match shasum "+s); if (sha !== s) { console.error(path.basename(file)+" sha doesn't match") fail = fail || new Error("Some shasums didn't match"); } } if (-- checks === 0) { if (fail) throw fail; } }