From 8e7b702d6ffa84d0de25877a49d9cf2be946f1f0 Mon Sep 17 00:00:00 2001 From: Carlos Lostao Date: Fri, 13 Sep 2024 14:34:23 +0200 Subject: [PATCH] test: adding test suites --- packages/auto-drive/tests/chunker.spec.ts | 157 ++++++++++++++++++++++ packages/auto-drive/tests/ipld.spec.ts | 29 ---- packages/auto-drive/tests/nodes.spec.ts | 70 ++++++++++ 3 files changed, 227 insertions(+), 29 deletions(-) create mode 100644 packages/auto-drive/tests/chunker.spec.ts delete mode 100644 packages/auto-drive/tests/ipld.spec.ts create mode 100644 packages/auto-drive/tests/nodes.spec.ts diff --git a/packages/auto-drive/tests/chunker.spec.ts b/packages/auto-drive/tests/chunker.spec.ts new file mode 100644 index 0000000..18c3ead --- /dev/null +++ b/packages/auto-drive/tests/chunker.spec.ts @@ -0,0 +1,157 @@ +import { createNode } from '@ipld/dag-pb' +import { cidOfNode } from '../src' +import { createFileIPLDDag, createFolderIPLDDag } from '../src/ipld/chunker' +import { IPLDNodeData, MetadataType } from '../src/metadata' + +describe('chunker', () => { + describe('file creation', () => { + it('create a file dag from a small buffer', () => { + const text = 'hello world' + const name = 'test.txt' + const dag = createFileIPLDDag(Buffer.from(text), name) + expect(dag.nodes.size).toBe(1) + + const node = dag.nodes.get(dag.headCID) + expect(node).toBeDefined() + expect(node?.Data).toBeDefined() + const decoded = IPLDNodeData.decode(node?.Data ?? new Uint8Array()) + expect(decoded.data).toBeDefined() + + /// Check the metadata + expect(decoded.name).toBe(name) + expect(decoded.type).toBe(MetadataType.File) + expect(Buffer.from(decoded.data ?? '').toString()).toBe(text) + expect(decoded.linkDepth).toBe(0) + expect(decoded.size).toBe(text.length) + + /// Check no links + expect(node?.Links.length).toBe(0) + }) + + it('create a file dag from a large buffer', () => { + const chunkSize = 1000 + const chunkNum = 10 + const chunk = 'h'.repeat(chunkSize) + const text = chunk.repeat(chunkNum) + + const name = 'test.txt' + + const dag = createFileIPLDDag(Buffer.from(text), name, { + chunkSize, + maxLinkPerNode: chunkSize / 64, + }) + + expect(dag.nodes.size).toBe(chunkNum + 1) + + const head = dag.nodes.get(dag.headCID) + expect(head?.Data).toBeDefined() + expect(head).toBeDefined() + expect(head?.Links.length).toBe(chunkNum) + + const decoded = IPLDNodeData.decode(head?.Data ?? new Uint8Array()) + expect(decoded.name).toBe(name) + expect(decoded.type).toBe(MetadataType.File) + expect(decoded.linkDepth).toBe(1) + expect(decoded.size).toBe(text.length) + + Array.from(dag.nodes.entries()).forEach(([cid, node]) => { + if (cid !== dag.headCID) { + expect(node?.Links.length).toBe(0) + } + }) + }) + + it('create a file dag with inlinks', () => { + const chunkSize = 1000 + const chunkNum = 10 + const chunk = 'h'.repeat(chunkSize) + const name = 'test.txt' + const text = chunk.repeat(chunkNum) + + /// 10 chunks + 3 inlinks + root + const EXPECTED_NODE_COUNT = 14 + + const dag = createFileIPLDDag(Buffer.from(text), name, { + chunkSize, + maxLinkPerNode: 4, + }) + + expect(dag.nodes.size).toBe(EXPECTED_NODE_COUNT) + + let [rootCount, inlinkCount, chunkCount] = [0, 0, 0] + + Array.from(dag.nodes.values()).forEach((node) => { + const decoded = IPLDNodeData.decode(node?.Data ?? new Uint8Array()) + if (decoded.type === MetadataType.File) { + rootCount++ + } else if (decoded.type === MetadataType.FileInlink) { + inlinkCount++ + } else if (decoded.type === MetadataType.FileChunk) { + chunkCount++ + } else { + throw new Error('Unexpected node type') + } + }) + + expect(rootCount).toBe(1) + expect(inlinkCount).toBe(3) + expect(chunkCount).toBe(10) + }) + }) + + describe('folder creation', () => { + it('create a folder dag from a small buffer', () => { + const links = Array.from({ length: 1 }, () => + cidOfNode(createNode(Buffer.from(Math.random().toString()))), + ) + const name = 'folder' + const size = 1000 + const dag = createFolderIPLDDag(links, name, size, { + maxLinkPerNode: 4, + }) + + expect(dag.nodes.size).toBe(1) + const node = dag.nodes.get(dag.headCID) + expect(node).toBeDefined() + expect(node?.Data).toBeDefined() + const decoded = IPLDNodeData.decode(node?.Data ?? new Uint8Array()) + expect(decoded.name).toBe(name) + expect(decoded.type).toBe(MetadataType.Folder) + expect(decoded.linkDepth).toBe(0) + expect(decoded.size).toBe(size) + }) + + it('create a folder dag with inlinks', () => { + const links = Array.from({ length: 10 }, () => + cidOfNode(createNode(Buffer.from(Math.random().toString()))), + ) + const name = 'folder' + const size = 1000 + + /// 3 inlinks + root + const EXPECTED_NODE_COUNT = 4 + + const dag = createFolderIPLDDag(links, name, size, { + maxLinkPerNode: 4, + }) + + expect(dag.nodes.size).toBe(EXPECTED_NODE_COUNT) + + let [rootCount, inlinkCount] = [0, 0, 0] + + Array.from(dag.nodes.values()).forEach((node) => { + const decoded = IPLDNodeData.decode(node?.Data ?? new Uint8Array()) + if (decoded.type === MetadataType.Folder) { + rootCount++ + } else if (decoded.type === MetadataType.FolderInlink) { + inlinkCount++ + } else { + throw new Error('Unexpected node type') + } + }) + + expect(rootCount).toBe(1) + expect(inlinkCount).toBe(3) + }) + }) +}) diff --git a/packages/auto-drive/tests/ipld.spec.ts b/packages/auto-drive/tests/ipld.spec.ts deleted file mode 100644 index 52cacf4..0000000 --- a/packages/auto-drive/tests/ipld.spec.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { createFileIPLDDag } from '../src/ipld/chunker.js' -import { IPLDNodeData, MetadataType } from '../src/metadata/onchain/protobuf/onchainMetadata.js' - -describe('ipld', () => { - describe('file creation', () => { - it('create a file dag from a small buffer', () => { - const text = 'hello world' - const name = 'test.txt' - const dag = createFileIPLDDag(Buffer.from(text), name) - expect(dag.nodes.size).toBe(1) - - const node = dag.nodes.get(dag.headCID) - expect(node).toBeDefined() - expect(node?.Data).toBeDefined() - const decoded = IPLDNodeData.decode(node?.Data ?? new Uint8Array()) - expect(decoded.data).toBeDefined() - - /// Check the metadata - expect(decoded.name).toBe(name) - expect(decoded.type).toBe(MetadataType.File) - expect(Buffer.from(decoded.data ?? '').toString()).toBe(text) - expect(decoded.linkDepth).toBe(0) - expect(decoded.size).toBe(text.length) - - /// Check no links - expect(node?.Links.length).toBe(0) - }) - }) -}) diff --git a/packages/auto-drive/tests/nodes.spec.ts b/packages/auto-drive/tests/nodes.spec.ts new file mode 100644 index 0000000..e699ac9 --- /dev/null +++ b/packages/auto-drive/tests/nodes.spec.ts @@ -0,0 +1,70 @@ +import { createNode } from '@ipld/dag-pb' +import { cidOfNode, createChunkedFileIpldNode, createSingleFileIpldNode } from '../src/index.js' +import { createChunkIpldNode } from '../src/ipld/nodes.js' +import { IPLDNodeData, MetadataType } from '../src/metadata/onchain/protobuf/onchainMetadata.js' + +describe('node creation', () => { + describe('files nodes', () => { + it('single file node | correctly params setup', () => { + const filename = 'test.txt' + const buffer = Buffer.from('hello world') + const node = createSingleFileIpldNode(buffer, filename) + const decoded = IPLDNodeData.decode(node.Data ?? new Uint8Array()) + expect(decoded.name).toBe(filename) + expect(decoded.size).toBe(buffer.length) + expect(Buffer.from(decoded.data ?? '').toString()).toBe(buffer.toString()) + }) + + it('single file root node | no name', () => { + const buffer = Buffer.from('hello world') + const node = createSingleFileIpldNode(buffer) + const decoded = IPLDNodeData.decode(node.Data ?? new Uint8Array()) + expect(decoded.type).toBe(MetadataType.File) + expect(decoded.name).toBeUndefined() + expect(decoded.size).toBe(buffer.length) + expect(Buffer.from(decoded.data ?? '').toString()).toBe(buffer.toString()) + }) + + it('chunked file root node | correctly params setup', () => { + const links = Array.from({ length: 10 }, () => + cidOfNode(createNode(Buffer.from(Math.random().toString()))), + ) + const size = 1000 + const linkDepth = 1 + const filename = 'test.txt' + const node = createChunkedFileIpldNode(links, size, linkDepth, filename) + + const decoded = IPLDNodeData.decode(node.Data ?? new Uint8Array()) + expect(decoded.type).toBe(MetadataType.File) + expect(decoded.name).toBe(filename) + expect(decoded.size).toBe(size) + expect(decoded.linkDepth).toBe(linkDepth) + }) + + it('chunked file root node | no name', () => { + const links = Array.from({ length: 10 }, () => + cidOfNode(createNode(Buffer.from(Math.random().toString()))), + ) + const size = 1000 + const linkDepth = 1 + const node = createChunkedFileIpldNode(links, size, linkDepth) + + const decoded = IPLDNodeData.decode(node.Data ?? new Uint8Array()) + expect(decoded.type).toBe(MetadataType.File) + expect(decoded.name).toBeUndefined() + expect(decoded.size).toBe(size) + expect(decoded.linkDepth).toBe(linkDepth) + }) + + it('file chunk node | correctly params setup', () => { + const buffer = Buffer.from('hello world') + const node = createChunkIpldNode(buffer) + + const decoded = IPLDNodeData.decode(node.Data ?? new Uint8Array()) + expect(decoded.type).toBe(MetadataType.FileChunk) + expect(decoded.name).toBeUndefined() + expect(decoded.size).toBe(buffer.length) + expect(decoded.linkDepth).toBe(0) + }) + }) +})