mirror of https://github.com/lukechilds/node.git
Browse Source
Originally written to try to track down this bug report: http://permalink.gmane.org/gmane.comp.lang.javascript.nodejs/13924 As it turns out, it's showing a completely different kind of failure. When the file is base64 encoded with the native program, then decoded with node, it doesn't match the original. Something's fishy.v0.7.4-release
isaacs
14 years ago
committed by
Ryan Dahl
1 changed files with 135 additions and 0 deletions
@ -0,0 +1,135 @@ |
|||||
|
|
||||
|
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"); |
||||
|
cp.exec("dd if=/dev/zero of="+bigFile+" bs=128m 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; |
||||
|
} |
||||
|
} |
||||
|
|
Loading…
Reference in new issue