test-pack-codec.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. var bodec = require('bodec');
  2. var run = require('./run.js');
  3. var decoders = require('../lib/object-codec.js').decoders;
  4. var encoders = require('../lib/object-codec.js').encoders;
  5. // The thing we mean to test.
  6. var codec = require('../lib/pack-codec.js');
  7. var pack = require('./sample-pack.js');
  8. var items = [];
  9. var newPack;
  10. function unpackStream(stream) {
  11. var meta, out = [], finished = false;
  12. var write = codec.decodePack(onItem);
  13. for (var i = 0, l = stream.length; i < l; i += 128) {
  14. var slice = bodec.slice(stream, i, i + 128);
  15. try {
  16. // console.log("SLICE", slice);
  17. write(slice);
  18. }
  19. catch (err) {
  20. throw err;
  21. }
  22. }
  23. write();
  24. function onItem(item) {
  25. // console.log("UNPACK", item);
  26. if (item === undefined) {
  27. finished = true;
  28. }
  29. else if (!meta) {
  30. meta = item;
  31. }
  32. else {
  33. out.push(item);
  34. }
  35. }
  36. if (!finished) throw new Error("unpack stream didn't finish");
  37. if (out.length !== meta.num) throw new Error("Item num mismatch");
  38. return out;
  39. }
  40. run([
  41. function testDecodePack() {
  42. var counts = {};
  43. items = unpackStream(pack).map(function (item) {
  44. counts[item.type] = counts[item.type] || 0;
  45. counts[item.type]++;
  46. if (item.type === "tree" || item.type === "tag" || item.type === "commit") {
  47. item.body = decoders[item.type](item.body);
  48. }
  49. return item;
  50. });
  51. if (counts.commit !== 6) throw new Error("Wrong number of commits parsed");
  52. if (counts.tree !== 4) throw new Error("Wrong number of trees parsed");
  53. if (counts.blob !== 4) throw new Error("Wrong number of blobs parsed");
  54. if (counts['ofs-delta'] !== 2) throw new Error("Wrong number of offset deltas parsed");
  55. },
  56. function testEncodePack() {
  57. var done = false;
  58. var outs = [];
  59. var write = codec.encodePack(function (item) {
  60. if (item === undefined) {
  61. done = true;
  62. return;
  63. }
  64. if (!bodec.isBinary(item)) throw new Error("encode output must be buffers");
  65. outs.push(item);
  66. });
  67. write({num:items.length});
  68. items.forEach(function (item) {
  69. if (!bodec.isBinary(item.body)) {
  70. item.body = encoders[item.type](item.body);
  71. }
  72. write(item);
  73. });
  74. write();
  75. if (!done) throw new Error("Output stream never ended");
  76. newPack = bodec.join(outs);
  77. },
  78. function verifyEncodePack() {
  79. try {
  80. unpackStream(newPack);
  81. if (bodec.toHex(pack) !== bodec.toHex(newPack)) {
  82. throw new Error("Final pack doesn't match original.");
  83. }
  84. }
  85. catch (err) {
  86. console.log(bodec.toHex(pack));
  87. console.log(bodec.toHex(newPack));
  88. throw err;
  89. }
  90. }
  91. ]);