--- a/tests/src/nesting/collectionProperties.seqtest.ts +++ b/tests/src/nesting/collectionProperties.seqtest.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {itSub, Pallets, usingPlaygrounds, expect, requirePalletsOrSkip} from '../util'; +import {itSub, Pallets, usingPlaygrounds, expect, requirePalletsOrSkip, sizeOfProperty} from '../util'; describe('Integration Test: Collection Properties with sudo', () => { let superuser: IKeyringPair; @@ -48,14 +48,14 @@ ]; const collection = await helper[testSuite.mode].mintCollection(alice, {properties}); - const newProperty = ' '.repeat(4096); - await collection.setProperties(alice, [{key: 'space', value: newProperty}]); + const newProperty = {key: 'space', value: ' '.repeat(4096)}; + await collection.setProperties(alice, [newProperty]); const originalSpace = await collection.getPropertiesConsumedSpace(); - expect(originalSpace).to.be.equal(properties[0].value.length + properties[1].value.length + newProperty.length); + expect(originalSpace).to.be.equal(sizeOfProperty(properties[0]) + sizeOfProperty(properties[1]) + sizeOfProperty(newProperty)); await helper.getSudo().executeExtrinsic(superuser, 'api.tx.unique.forceRepairCollection', [collection.collectionId], true); const recomputedSpace = await collection.getPropertiesConsumedSpace(); expect(recomputedSpace).to.be.equal(originalSpace); }); })); -}); \ No newline at end of file +}); --- a/tests/src/nesting/collectionProperties.test.ts +++ b/tests/src/nesting/collectionProperties.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {itSub, Pallets, usingPlaygrounds, expect, requirePalletsOrSkip} from '../util'; +import {itSub, Pallets, usingPlaygrounds, expect, requirePalletsOrSkip, sizeOfProperty} from '../util'; describe('Integration Test: Collection Properties', () => { let alice: IKeyringPair; @@ -134,9 +134,10 @@ return `${propDataChar}`.repeat(propDataSize); }; - await collection.setProperties(alice, [{key: propKey, value: makeNewPropData()}]); + const property = {key: propKey, value: makeNewPropData()}; + await collection.setProperties(alice, [property]); const originalSpace = await collection.getPropertiesConsumedSpace(); - expect(originalSpace).to.be.equal(propDataSize); + expect(originalSpace).to.be.equal(sizeOfProperty(property)); const sameSizePropertiesPossibleNum = maxCollectionPropertiesSize / propDataSize; @@ -158,9 +159,10 @@ const propDataSize = 4096; const propData = 'a'.repeat(propDataSize); - await collection.setProperties(alice, [{key: propKey, value: propData}]); + const property = {key: propKey, value: propData}; + await collection.setProperties(alice, [property]); let consumedSpace = await collection.getPropertiesConsumedSpace(); - expect(consumedSpace).to.be.equal(propDataSize); + expect(consumedSpace).to.be.equal(sizeOfProperty(property)); await collection.deleteProperties(alice, [propKey]); consumedSpace = await collection.getPropertiesConsumedSpace(); @@ -173,31 +175,27 @@ const collection = await helper[testSuite.mode].mintCollection(alice); const originalSpace = await collection.getPropertiesConsumedSpace(); - const initPropDataSize = 4096; - const biggerPropDataSize = 5000; - const smallerPropDataSize = 4000; - - const initPropData = 'a'.repeat(initPropDataSize); - const biggerPropData = 'b'.repeat(biggerPropDataSize); - const smallerPropData = 'c'.repeat(smallerPropDataSize); + const initProp = {key: propKey, value: 'a'.repeat(4096)}; + const biggerProp = {key: propKey, value: 'b'.repeat(5000)}; + const smallerProp = {key: propKey, value: 'c'.repeat(4000)}; let consumedSpace; let expectedConsumedSpaceDiff; - await collection.setProperties(alice, [{key: propKey, value: initPropData}]); + await collection.setProperties(alice, [initProp]); consumedSpace = await collection.getPropertiesConsumedSpace(); - expectedConsumedSpaceDiff = initPropDataSize - originalSpace; + expectedConsumedSpaceDiff = sizeOfProperty(initProp) - originalSpace; expect(consumedSpace).to.be.equal(originalSpace + expectedConsumedSpaceDiff); - await collection.setProperties(alice, [{key: propKey, value: biggerPropData}]); + await collection.setProperties(alice, [biggerProp]); consumedSpace = await collection.getPropertiesConsumedSpace(); - expectedConsumedSpaceDiff = biggerPropDataSize - initPropDataSize; - expect(consumedSpace).to.be.equal(initPropDataSize + expectedConsumedSpaceDiff); + expectedConsumedSpaceDiff = sizeOfProperty(biggerProp) - sizeOfProperty(initProp); + expect(consumedSpace).to.be.equal(sizeOfProperty(initProp) + expectedConsumedSpaceDiff); - await collection.setProperties(alice, [{key: propKey, value: smallerPropData}]); + await collection.setProperties(alice, [smallerProp]); consumedSpace = await collection.getPropertiesConsumedSpace(); - expectedConsumedSpaceDiff = biggerPropDataSize - smallerPropDataSize; - expect(consumedSpace).to.be.equal(biggerPropDataSize - expectedConsumedSpaceDiff); + expectedConsumedSpaceDiff = sizeOfProperty(biggerProp) - sizeOfProperty(smallerProp); + expect(consumedSpace).to.be.equal(sizeOfProperty(biggerProp) - expectedConsumedSpaceDiff); }); })); }); @@ -237,7 +235,7 @@ itSub('Fails to set properties that exceed the limits', async ({helper}) => { const collection = await helper[testSuite.mode].mintCollection(alice); - const spaceLimit = (await (collection.helper!.api! as any).query.common.collectionProperties(collection.collectionId)).spaceLimit.toNumber(); + const spaceLimit = helper.getApi().consts.unique.maxCollectionPropertiesSize.toNumber(); // Mute the general tx parsing error, too many bytes to process { --- a/tests/src/nesting/tokenProperties.seqtest.ts +++ b/tests/src/nesting/tokenProperties.seqtest.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {itSub, Pallets, usingPlaygrounds, expect, requirePalletsOrSkip} from '../util'; +import {itSub, Pallets, usingPlaygrounds, expect, requirePalletsOrSkip, sizeOfProperty} from '../util'; describe('Integration Test: Token Properties with sudo', () => { let superuser: IKeyringPair; @@ -57,16 +57,15 @@ : collection.mintToken(alice) ); - const propDataSize = 4096; - const propData = 'a'.repeat(propDataSize); + const prop = {key: propKey, value: 'a'.repeat(4096)}; - await token.setProperties(alice, [{key: propKey, value: propData}]); + await token.setProperties(alice, [prop]); const originalSpace = await token.getTokenPropertiesConsumedSpace(); - expect(originalSpace).to.be.equal(propDataSize); + expect(originalSpace).to.be.equal(sizeOfProperty(prop)); await helper.getSudo().executeExtrinsic(superuser, 'api.tx.unique.forceRepairItem', [token.collectionId, token.tokenId], true); const recomputedSpace = await token.getTokenPropertiesConsumedSpace(); expect(recomputedSpace).to.be.equal(originalSpace); }); })); -}); \ No newline at end of file +}); --- a/tests/src/nesting/tokenProperties.test.ts +++ b/tests/src/nesting/tokenProperties.test.ts @@ -15,7 +15,7 @@ // along with Unique Network. If not, see . import {IKeyringPair} from '@polkadot/types/types'; -import {itSub, Pallets, requirePalletsOrSkip, usingPlaygrounds, expect} from '../util'; +import {itSub, Pallets, requirePalletsOrSkip, usingPlaygrounds, expect, sizeOfProperty} from '../util'; import {UniqueHelper, UniqueNFToken, UniqueRFToken} from '../util/playgrounds/unique'; describe('Integration Test: Token Properties', () => { @@ -353,9 +353,10 @@ : collection.mintToken(alice) ); - await token.setProperties(alice, [{key: propKey, value: makeNewPropData()}]); + const property = {key: propKey, value: makeNewPropData()}; + await token.setProperties(alice, [property]); const originalSpace = await token.getTokenPropertiesConsumedSpace(); - expect(originalSpace).to.be.equal(propDataSize); + expect(originalSpace).to.be.equal(sizeOfProperty(property)); const sameSizePropertiesPossibleNum = maxTokenPropertiesSize / propDataSize; @@ -393,9 +394,10 @@ const propDataSize = 4096; const propData = 'a'.repeat(propDataSize); - await token.setProperties(alice, [{key: propKey, value: propData}]); + const property = {key: propKey, value: propData}; + await token.setProperties(alice, [property]); let consumedSpace = await token.getTokenPropertiesConsumedSpace(); - expect(consumedSpace).to.be.equal(propDataSize); + expect(consumedSpace).to.be.equal(sizeOfProperty(property)); await token.deleteProperties(alice, [propKey]); consumedSpace = await token.getTokenPropertiesConsumedSpace(); @@ -424,31 +426,27 @@ ); const originalSpace = await token.getTokenPropertiesConsumedSpace(); - const initPropDataSize = 4096; - const biggerPropDataSize = 5000; - const smallerPropDataSize = 4000; - - const initPropData = 'a'.repeat(initPropDataSize); - const biggerPropData = 'b'.repeat(biggerPropDataSize); - const smallerPropData = 'c'.repeat(smallerPropDataSize); + const initProp = {key: propKey, value: 'a'.repeat(4096)}; + const biggerProp = {key: propKey, value: 'b'.repeat(5000)}; + const smallerProp = {key: propKey, value: 'c'.repeat(4000)}; let consumedSpace; let expectedConsumedSpaceDiff; - await token.setProperties(alice, [{key: propKey, value: initPropData}]); + await token.setProperties(alice, [initProp]); consumedSpace = await token.getTokenPropertiesConsumedSpace(); - expectedConsumedSpaceDiff = initPropDataSize - originalSpace; + expectedConsumedSpaceDiff = sizeOfProperty(initProp) - originalSpace; expect(consumedSpace).to.be.equal(originalSpace + expectedConsumedSpaceDiff); - await token.setProperties(alice, [{key: propKey, value: biggerPropData}]); + await token.setProperties(alice, [biggerProp]); consumedSpace = await token.getTokenPropertiesConsumedSpace(); - expectedConsumedSpaceDiff = biggerPropDataSize - initPropDataSize; - expect(consumedSpace).to.be.equal(initPropDataSize + expectedConsumedSpaceDiff); + expectedConsumedSpaceDiff = sizeOfProperty(biggerProp) - sizeOfProperty(initProp); + expect(consumedSpace).to.be.equal(sizeOfProperty(initProp) + expectedConsumedSpaceDiff); - await token.setProperties(alice, [{key: propKey, value: smallerPropData}]); + await token.setProperties(alice, [smallerProp]); consumedSpace = await token.getTokenPropertiesConsumedSpace(); - expectedConsumedSpaceDiff = biggerPropDataSize - smallerPropDataSize; - expect(consumedSpace).to.be.equal(biggerPropDataSize - expectedConsumedSpaceDiff); + expectedConsumedSpaceDiff = sizeOfProperty(biggerProp) - sizeOfProperty(smallerProp); + expect(consumedSpace).to.be.equal(sizeOfProperty(biggerProp) - expectedConsumedSpaceDiff); })); }); --- a/tests/src/util/index.ts +++ b/tests/src/util/index.ts @@ -176,3 +176,26 @@ } describeXCM.skip = (name: string, fn: (this: Mocha.Suite) => void) => describeXCM(name, fn, {skip: true}); + +export function sizeOfInt(i: number) { + if (i < 0 || i > 0xffffffff) throw new Error('out of range'); + if(i < 0b11_1111) { + return 1; + } else if (i < 0b11_1111_1111_1111) { + return 2; + } else if (i < 0b11_1111_1111_1111_1111_1111_1111_1111) { + return 4; + } else { + return 5; + } +} + +const UTF8_ENCODER = new TextEncoder(); +export function sizeOfEncodedStr(v: string) { + const encoded = UTF8_ENCODER.encode(v); + return sizeOfInt(encoded.length) + encoded.length; +} + +export function sizeOfProperty(prop: {key: string, value: string}) { + return sizeOfEncodedStr(prop.key) + sizeOfEncodedStr(prop.value); +}