bundle_test.ts 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. /* Copyright 2023 Google Inc. All Rights Reserved.
  2. Distributed under MIT license.
  3. See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
  4. */
  5. import {brotliDecode} from "./decode";
  6. import {makeTestData} from "./test_data";
  7. const CRC_64_POLY = new Uint32Array([0xD7870F42, 0xC96C5795]);
  8. /**
  9. * Calculates binary data footprint.
  10. */
  11. function calculateCrc64(data: Int8Array): string {
  12. const crc = new Uint32Array([0xFFFFFFFF, 0xFFFFFFFF]);
  13. const c = new Uint32Array(2);
  14. for (let i = 0; i < data.length; ++i) {
  15. c[1] = 0;
  16. c[0] = (crc[0] ^ data[i]) & 0xFF;
  17. for (let k = 0; k < 8; ++k) {
  18. const isOdd = c[0] & 1;
  19. c[0] = (c[0] >>> 1) | ((c[1] & 1) << 31);
  20. c[1] = c[1] >>> 1;
  21. if (isOdd) {
  22. c[0] = c[0] ^ CRC_64_POLY[0];
  23. c[1] = c[1] ^ CRC_64_POLY[1];
  24. }
  25. }
  26. crc[0] = ((crc[0] >>> 8) | ((crc[1] & 0xFF) << 24)) ^ c[0];
  27. crc[1] = (crc[1] >>> 8) ^ c[1];
  28. }
  29. crc[0] = ~crc[0];
  30. crc[1] = ~crc[1];
  31. let lo = crc[0].toString(16);
  32. lo = "0".repeat(8 - lo.length) + lo;
  33. let hi = crc[1].toString(16);
  34. hi = "0".repeat(8 - hi.length) + hi;
  35. return hi + lo;
  36. }
  37. /**
  38. * Decompresses data and checks that output footprint is correct.
  39. */
  40. function checkEntry(entry: string, data: Int8Array) {
  41. const expectedCrc = entry.substring(0, 16);
  42. const decompressed = brotliDecode(data);
  43. const crc = calculateCrc64(decompressed);
  44. expect(expectedCrc).toEqual(crc);
  45. }
  46. describe("BundleTest", () => {
  47. const testData = makeTestData();
  48. for (const entry in testData) {
  49. if (!testData.hasOwnProperty(entry)) {
  50. continue;
  51. }
  52. const name = entry.substring(17);
  53. const data = testData[entry];
  54. it('test_' + name, checkEntry.bind(null, entry, data));
  55. }
  56. });