Giter Club home page Giter Club logo

codec-fixtures's Introduction

IPLD Codec Fixtures

Test against latest libraries

This repository contains fixtures for standard IPLD codecs. It is used to verify the correctness, compatibility and limitations of IPLD implementations.

What?

The fixtures directory contains a suite of test data, where each subdirectory comprises an encoded IPLD block in the formats that are supported for that data. A file containing the binary encoded form of that block has the name <CID>.<codec-name>, where the CID is the CIDv1 using a SHA2-256 multihash of the block for that codec. The codec-name is the standard codec name as found in the multicodec table.

Fixtures are also available in CAR format, in the ./fixtures.car file, with every valid variation stored as a separate block. (Note that this file includes blocks that may not be readable on some systems, e.g. Kubo because of the currently unsupported Go edge cases).

Codec implementations are expected to be able to:

  1. Read and decode the IPLD block from these files
  2. Re-encode the IPLD block using the supported codecs
  3. Compare the CID of the re-encoded block to the expected CID as per the filename for the given codec

Since the block is encoded in different forms, by re-encoding each decoded form into the different codecs, we are able to test the correctness of the decoding as well as the encoding process. Where the CIDs do not match, there has been a problem either in decoding or encoding the data. If the same error occurs for the data loaded from differently encoded blocks, the error is likely to be with the encoding process. If the error only occurs when re-encoding from a single encoded form of the block then the error may be with the decoding process.

Adding fixtures

The _fixtures_src directory contains the source of each of fixtures contained in the fixtures directory. Each file in _fixtures_src contains an encoded form of a block using one of the supported codecs. The name of the file is <fixture-name>.<codec-name>. The js/make-fixtures.js program (run with make build) is used to generate the fixtures in fixtures for each of the source files.

Fixture generation uses the JavaScript stack for generating data, but this is not a requirement. If you would like to add fixtures and would like to create them manually, or add an alternative mechanism for generating fixtures from source then please do so.

Negative Fixtures

Separately to the positive fixtures, there is a negative-fixtures directory that contains failure conditions for codecs. These don't require a compile step, so are not included in the _fixtures_src directory but are edited directly.

The structure for negative fixtures subdirectories is: negative-fixtures/<codec name>/{encode,decode}/<fixtures>.json. Where <codec name> is the canonical name of the codec being tested. encode and decode are fixtures that test the encode and decode paths of a codec, and <fixture> is an arbitrary name containing one or more fixture within the JSON structure.

Test runners will load as manu fixture files as exist in these subdirectories and extract and run the cases defined there.

Encode

Negative fixtures for an encode phase involve defining a data model form that should cause an error when passed through an Encode() for that codec. The data model form is instantiated by running the fixture data through an existing IPLD codec's decoder (mostly DAG-JSON data embedded within the JSON fixture document) and then attempting to pass that data model form into the codec and inspecting the error. Error messages may or may not be matched in some way, depending on the complexity of the implementation—it is more important that a failure occur than the error is exact.

Decode

Negative fixtures for a decode phase involve loading a block's bytes from a hex form from the fixture data and passing those bytes through a Decode() for that codec and inspecting the error. Error messages may or may not be matched in some way, depending on the complexity of the implementation—it is more important that a failure occur than the error is exact.

Implementations & Codecs

Go

Fixtures are tested against the go-ipld-prime stack:

JavaScript

Fixtures are tested against the js-multiformats stack:

Rust

Fixtures are tested against the libipld stack:

Running tests

JavaScript

make testjs

Or, in the js directory, run:

npm install
npm test

Go

make testgo

Or, in the go directory, run:

go test

Rust

make testrust

Or in the rust directory, run:

cargo test -- --nocapture

Generating testmark output for ipld.io

Each codec tested here has a corresponding file in the https://github.com/ipld/ipld repository which generates the https://ipld.io website containing the fixture data in testmark format. The filename per codec is is specs/codecs/<CODEC>/fixtures/cross-codec/index.md.

The js/make-testmark.js program can be used to update those files when the data is updated here. Run it with node js/make-testmark.js <path/to/ipld/ipld/repository>.

License

Licensed under either of

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

codec-fixtures's People

Contributors

dependabot[bot] avatar galargh avatar rvagg avatar sionois avatar vmx avatar web-flow avatar web3-bot avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

codec-fixtures's Issues

Add DAG-PB fixtures

Existing fixtures in js-dag-pb and go-codec-dagpb are pretty good, pull them here and run them. JS is set up to handle them already but Go will need to handle the special-casing of dag-pb only being available for a subset of the fixtures.

Go: int--9223372036854776000 fixture

I wonder why the int--9223372036854776000 test fixture is passing on Go. It is not marked for being skipped. -9223372036854776000 is out of range of an int64, so I'd expect an error.

Testing current versions

The CI is bit confusing. Currently we test JS, Go and Rust with their master branches. We don't test JS and Rust with their released versions. That only happens with the Go versions.

I'm not sure if the automated CI is a good fit, given that this is a cross language repo. Anyway, I suggest that we also have a job that runs JS and Rust on the released version.

Revisit codec-fixtures explainer docs on README & ipld.io

Difficult for folks to grok what's going on here, need to come up with more clarity.

The versions currently available on ipld.io also don't list these quite the way they should either, need to revisit that and the language there.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.