StringArrayStorage.spec.ts 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. import 'reflect-metadata';
  2. import { assert } from 'chai';
  3. import { ServiceIdentifiers } from '../../../../../src/container/ServiceIdentifiers';
  4. import { TInputOptions } from '../../../../../src/types/options/TInputOptions';
  5. import { IInversifyContainerFacade } from '../../../../../src/interfaces/container/IInversifyContainerFacade';
  6. import { IStringArrayStorage } from '../../../../../src/interfaces/storages/string-array-transformers/IStringArrayStorage';
  7. import { IStringArrayStorageItemData } from '../../../../../src/interfaces/storages/string-array-transformers/IStringArrayStorageItem';
  8. import { StringArrayEncoding } from '../../../../../src/enums/node-transformers/string-array-transformers/StringArrayEncoding';
  9. import { NO_ADDITIONAL_NODES_PRESET } from '../../../../../src/options/presets/NoCustomNodes';
  10. import { InversifyContainerFacade } from '../../../../../src/container/InversifyContainerFacade';
  11. /**
  12. * @returns {IMapStorage<string, V>}
  13. */
  14. const getStorageInstance = (options: TInputOptions = {}): IStringArrayStorage => {
  15. const inversifyContainerFacade: IInversifyContainerFacade = new InversifyContainerFacade();
  16. inversifyContainerFacade.load('', '', {
  17. ...NO_ADDITIONAL_NODES_PRESET,
  18. stringArray: true,
  19. stringArrayThreshold: 1,
  20. ...options
  21. });
  22. const storage: IStringArrayStorage = inversifyContainerFacade.get(ServiceIdentifiers.IStringArrayStorage);
  23. storage.initialize();
  24. return storage;
  25. };
  26. const getStringArrayStorageItemData = (
  27. stringArrayStorage: IStringArrayStorage,
  28. value: string,
  29. decodeKeys: string[]
  30. ): IStringArrayStorageItemData | undefined => {
  31. (<any>stringArrayStorage).rc4Keys = [
  32. 'foo',
  33. ...decodeKeys
  34. ];
  35. return stringArrayStorage.get(value);
  36. };
  37. describe('StringArrayStorage', () => {
  38. describe('rc4 encoded value collision fix', () => {
  39. const samplesCount: number = 100;
  40. let isCollisionHappened: boolean = false;
  41. before(() => {
  42. const stringArrayStorage: IStringArrayStorage = getStorageInstance({
  43. stringArrayEncoding: [StringArrayEncoding.Rc4]
  44. });
  45. for (let i = 0; i < samplesCount; i++) {
  46. const {encodedValue: firstEncodedValue} = getStringArrayStorageItemData(stringArrayStorage, '_15', ['CRDL']) || {};
  47. const {encodedValue: secondEncodedValue} = getStringArrayStorageItemData(stringArrayStorage, '_12', ['q9mB']) || {};
  48. if (firstEncodedValue === secondEncodedValue) {
  49. isCollisionHappened = true;
  50. break;
  51. }
  52. }
  53. });
  54. it('should not make a collision between different source values with different keys', () => {
  55. assert.equal(isCollisionHappened, false);
  56. });
  57. });
  58. describe('Cache key collision when rc4 and base64 encoded values for different input strings are the same', () => {
  59. const samplesCount: number = 100;
  60. let isCollisionHappened: boolean = false;
  61. before(() => {
  62. const stringArrayStorage: IStringArrayStorage = getStorageInstance({
  63. stringArrayEncoding: [
  64. StringArrayEncoding.Base64,
  65. StringArrayEncoding.Rc4
  66. ]
  67. });
  68. for (let i = 0; i < samplesCount; i++) {
  69. const {
  70. encodedValue: firstEncodedValue,
  71. encoding: firstEncodedValueEncoding
  72. } = getStringArrayStorageItemData(stringArrayStorage, 'zxL', ['&Jfx', '[lR4']) || {};
  73. const {
  74. encodedValue: secondEncodedValue,
  75. encoding: secondEncodedValueEncoding
  76. } = getStringArrayStorageItemData(stringArrayStorage, 'omC', ['&Jfx', '[lR4']) || {};
  77. if (
  78. firstEncodedValue === secondEncodedValue
  79. && firstEncodedValueEncoding === secondEncodedValueEncoding
  80. ) {
  81. isCollisionHappened = true;
  82. break;
  83. }
  84. }
  85. });
  86. it('should not make a cache key collision between different encoded input strings', () => {
  87. assert.equal(isCollisionHappened, false);
  88. });
  89. });
  90. });