StringArrayStorage.spec.ts 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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 { StringArrayEncoding } from '../../../../../src/enums/StringArrayEncoding';
  8. import { NO_ADDITIONAL_NODES_PRESET } from '../../../../../src/options/presets/NoCustomNodes';
  9. import { InversifyContainerFacade } from '../../../../../src/container/InversifyContainerFacade';
  10. /**
  11. * @returns {IMapStorage<string, V>}
  12. */
  13. const getStorageInstance = (options: TInputOptions = {}): IStringArrayStorage => {
  14. const inversifyContainerFacade: IInversifyContainerFacade = new InversifyContainerFacade();
  15. inversifyContainerFacade.load('', '', {
  16. ...NO_ADDITIONAL_NODES_PRESET,
  17. stringArray: true,
  18. stringArrayThreshold: 1,
  19. ...options
  20. });
  21. const storage: IStringArrayStorage = inversifyContainerFacade.get(ServiceIdentifiers.IStringArrayStorage);
  22. storage.initialize();
  23. return storage;
  24. };
  25. const getEncodedValue = (stringArrayStorage: IStringArrayStorage, value: string, decodeKey: string): string => {
  26. (<any>stringArrayStorage).rc4Keys = [
  27. 'foo',
  28. decodeKey
  29. ];
  30. return stringArrayStorage.get(value)?.encodedValue ?? '';
  31. };
  32. describe('StringArrayStorage', () => {
  33. describe('rc4 encoded value collision fix', () => {
  34. const samplesCount: number = 100;
  35. let firstEncodedValue: string;
  36. let secondEncodedValue: string;
  37. let isCollisionHappened: boolean = false;
  38. before(() => {
  39. const stringArrayStorage: IStringArrayStorage = getStorageInstance({
  40. stringArrayEncoding: [StringArrayEncoding.Rc4]
  41. });
  42. for (let i = 0; i < samplesCount; i++) {
  43. firstEncodedValue = getEncodedValue(stringArrayStorage, '_15', 'CRDL');
  44. secondEncodedValue = getEncodedValue(stringArrayStorage, '_12', 'q9mB');
  45. if (firstEncodedValue === secondEncodedValue) {
  46. isCollisionHappened = true;
  47. break;
  48. }
  49. }
  50. });
  51. it('should not make a collision between different source values with different keys', () => {
  52. assert.equal(isCollisionHappened, false);
  53. });
  54. });
  55. });