Skip to content

Commit

Permalink
test: adding test suites
Browse files Browse the repository at this point in the history
  • Loading branch information
clostao committed Sep 13, 2024
1 parent 0c0bb05 commit 8e7b702
Show file tree
Hide file tree
Showing 3 changed files with 227 additions and 29 deletions.
157 changes: 157 additions & 0 deletions packages/auto-drive/tests/chunker.spec.ts
Original file line number Diff line number Diff line change
@@ -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)
})
})
})
29 changes: 0 additions & 29 deletions packages/auto-drive/tests/ipld.spec.ts

This file was deleted.

70 changes: 70 additions & 0 deletions packages/auto-drive/tests/nodes.spec.ts
Original file line number Diff line number Diff line change
@@ -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)
})
})
})

0 comments on commit 8e7b702

Please sign in to comment.