This app provides monitoring and information features for the common freifunk user and the technical stuff of a freifunk community.
Code base is taken from a TUM Practical Course project and added here to see if Freifunk Altdorf can use it.
https://www.freifunk-altdorf.de
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
197 lines
5.5 KiB
197 lines
5.5 KiB
'use strict'; |
|
|
|
var fs = require('fs'); |
|
var path = require('path'); |
|
var nodeunit = require('nodeunit'); |
|
var bplistParser = require('bplist-parser'); |
|
var bplistCreator = require('../'); |
|
|
|
module.exports = { |
|
// 'iTunes Small': function(test) { |
|
// var file = path.join(__dirname, "iTunes-small.bplist"); |
|
// testFile(test, file); |
|
// }, |
|
|
|
'sample1': function(test) { |
|
var file = path.join(__dirname, "sample1.bplist"); |
|
testFile(test, file); |
|
}, |
|
|
|
'sample2': function(test) { |
|
var file = path.join(__dirname, "sample2.bplist"); |
|
testFile(test, file); |
|
}, |
|
|
|
'binary data': function(test) { |
|
var file = path.join(__dirname, "binaryData.bplist"); |
|
testFile(test, file); |
|
}, |
|
|
|
'airplay': function(test) { |
|
var file = path.join(__dirname, "airplay.bplist"); |
|
testFile(test, file); |
|
}, |
|
|
|
// 'utf16': function(test) { |
|
// var file = path.join(__dirname, "utf16.bplist"); |
|
// testFile(test, file); |
|
// }, |
|
|
|
// 'uid': function(test) { |
|
// var file = path.join(__dirname, "uid.bplist"); |
|
// testFile(test, file); |
|
// } |
|
}; |
|
|
|
function testFile(test, file) { |
|
fs.readFile(file, function(err, fileData) { |
|
if (err) { |
|
return test.done(err); |
|
} |
|
|
|
bplistParser.parseFile(file, function(err, dicts) { |
|
if (err) { |
|
return test.done(err); |
|
} |
|
|
|
// airplay overrides |
|
if (dicts && dicts[0] && dicts[0].loadedTimeRanges && dicts[0].loadedTimeRanges[0] && dicts[0].loadedTimeRanges[0].hasOwnProperty('start')) { |
|
dicts[0].loadedTimeRanges[0].start = { |
|
bplistOverride: true, |
|
type: 'double', |
|
value: dicts[0].loadedTimeRanges[0].start |
|
}; |
|
} |
|
if (dicts && dicts[0] && dicts[0].loadedTimeRanges && dicts[0].seekableTimeRanges[0] && dicts[0].seekableTimeRanges[0].hasOwnProperty('start')) { |
|
dicts[0].seekableTimeRanges[0].start = { |
|
bplistOverride: true, |
|
type: 'double', |
|
value: dicts[0].seekableTimeRanges[0].start |
|
}; |
|
} |
|
if (dicts && dicts[0] && dicts[0].hasOwnProperty('rate')) { |
|
dicts[0].rate = { |
|
bplistOverride: true, |
|
type: 'double', |
|
value: dicts[0].rate |
|
}; |
|
} |
|
|
|
// utf16 |
|
if (dicts && dicts[0] && dicts[0].hasOwnProperty('NSHumanReadableCopyright')) { |
|
dicts[0].NSHumanReadableCopyright = { |
|
bplistOverride: true, |
|
type: 'string-utf16', |
|
value: dicts[0].NSHumanReadableCopyright |
|
}; |
|
} |
|
if (dicts && dicts[0] && dicts[0].hasOwnProperty('CFBundleExecutable')) { |
|
dicts[0].CFBundleExecutable = { |
|
bplistOverride: true, |
|
type: 'string', |
|
value: dicts[0].CFBundleExecutable |
|
}; |
|
} |
|
if (dicts && dicts[0] && dicts[0].CFBundleURLTypes && dicts[0].CFBundleURLTypes[0] && dicts[0].CFBundleURLTypes[0].hasOwnProperty('CFBundleURLSchemes')) { |
|
dicts[0].CFBundleURLTypes[0].CFBundleURLSchemes[0] = { |
|
bplistOverride: true, |
|
type: 'string', |
|
value: dicts[0].CFBundleURLTypes[0].CFBundleURLSchemes[0] |
|
}; |
|
} |
|
if (dicts && dicts[0] && dicts[0].hasOwnProperty('CFBundleDisplayName')) { |
|
dicts[0].CFBundleDisplayName = { |
|
bplistOverride: true, |
|
type: 'string', |
|
value: dicts[0].CFBundleDisplayName |
|
}; |
|
} |
|
if (dicts && dicts[0] && dicts[0].hasOwnProperty('DTPlatformBuild')) { |
|
dicts[0].DTPlatformBuild = { |
|
bplistOverride: true, |
|
type: 'string', |
|
value: dicts[0].DTPlatformBuild |
|
}; |
|
} |
|
|
|
var buf = bplistCreator(dicts); |
|
compareBuffers(test, buf, fileData); |
|
return test.done(); |
|
}); |
|
}); |
|
} |
|
|
|
function compareBuffers(test, buf1, buf2) { |
|
if (buf1.length !== buf2.length) { |
|
printBuffers(buf1, buf2); |
|
return test.fail("buffer size mismatch. found: " + buf1.length + ", expected: " + buf2.length + "."); |
|
} |
|
for (var i = 0; i < buf1.length; i++) { |
|
if (buf1[i] !== buf2[i]) { |
|
printBuffers(buf1, buf2); |
|
return test.fail("buffer mismatch at offset 0x" + i.toString(16) + ". found: 0x" + buf1[i].toString(16) + ", expected: 0x" + buf2[i].toString(16) + "."); |
|
} |
|
} |
|
} |
|
|
|
function printBuffers(buf1, buf2) { |
|
var i, t; |
|
for (var lineOffset = 0; lineOffset < buf1.length || lineOffset < buf2.length; lineOffset += 16) { |
|
var line = ''; |
|
|
|
t = ('000000000' + lineOffset.toString(16)); |
|
line += t.substr(t.length - 8) + ': '; |
|
|
|
for (i = 0; i < 16; i++) { |
|
if (i == 8) { |
|
line += ' '; |
|
} |
|
if (lineOffset + i < buf1.length) { |
|
t = ('00' + buf1[lineOffset + i].toString(16)); |
|
line += t.substr(t.length - 2) + ' '; |
|
} else { |
|
line += ' '; |
|
} |
|
} |
|
line += ' '; |
|
for (i = 0; i < 16; i++) { |
|
if (lineOffset + i < buf1.length) { |
|
t = String.fromCharCode(buf1[lineOffset + i]); |
|
if (t < ' ' || t > '~') { |
|
t = '.'; |
|
} |
|
line += t; |
|
} else { |
|
line += ' '; |
|
} |
|
} |
|
|
|
line += ' - '; |
|
|
|
for (i = 0; i < 16; i++) { |
|
if (i == 8) { |
|
line += ' '; |
|
} |
|
if (lineOffset + i < buf2.length) { |
|
t = ('00' + buf2[lineOffset + i].toString(16)); |
|
line += t.substr(t.length - 2) + ' '; |
|
} else { |
|
line += ' '; |
|
} |
|
} |
|
line += ' '; |
|
for (i = 0; i < 16; i++) { |
|
if (lineOffset + i < buf2.length) { |
|
t = String.fromCharCode(buf2[lineOffset + i]); |
|
if (t < ' ' || t > '~') { |
|
t = '.'; |
|
} |
|
line += t; |
|
} else { |
|
line += ' '; |
|
} |
|
} |
|
|
|
console.log(line); |
|
} |
|
}
|
|
|