79453663b3
* Annotate api,proxy_util,blockstore_badger, policy tests * Annotate splitstore: bsbadger / markset * Annotate splitstore feature * Annotate union/timed blockstore tests * Annotate openrpc, diff_adt tests * Annotate error,drand,events tests * Annotate predicates_test * Fix annotations * Annotate tscache, gen tests * Annotate fundmanager test * Annotate repub and selection tests * Annotate statetree_test * Annotate forks_test * Annotate searchwait_test.go * Fix duplicated @@ symbols * Annotate chain stmgr/store tests * Annotate more (types) tests * More tests annotated * Annotate conformance chaos actor tests * Annotate more integration tests * Annotate journal system tests * Annotate more tests. * Annotate gas,head buffer behaviors * Fix markset annotations * doc: test annotations for the markets dagstore wrapper * Annotate miner_api test in dagstore * Annotate more test files * Remove bad annotations from fsrepo * Annotate wdpost system * Remove bad annotations * Renamce "conformance" to "chaos_actor" tests * doc: stm annotations for blockheader & election proof tests * Annotate remaining "A" tests * annotate: stm for error_test * memrepo_test.go * Annotate "b" file tests * message_test.go * doc: stm annotate for fsrepo_test * Annotate "c" file tests * Annotate "D" test files * message_test.go * doc: stm annotate for chain, node/config & client * docs: stm annotate node_test * Annotate u,v,wl tests * doc: stm annotations for various test files * Annotate "T" test files * doc: stm annotate for proxy_util_test & policy_test * doc: stm annotate for various tests * doc: final few stm annotations * Add mempool unit tests * Add two more memPool Add tests * Update submodules * Add check function tests * Add stm annotations, refactor test helper * Annotate api,proxy_util,blockstore_badger, policy tests * Annotate splitstore: bsbadger / markset solving merge conflicts * Annotate splitstore feature * Annotate union/timed blockstore tests * Annotate openrpc, diff_adt tests * Annotate error,drand,events tests * Annotate predicates_test * Fix annotations * Annotate tscache, gen tests * Annotate fundmanager test * Annotate statetree_test * Annotate forks_test * Annotate searchwait_test.go * Fix duplicated @@ symbols * Annotate chain stmgr/store tests * Annotate more (types) tests * More tests annotated * Annotate conformance chaos actor tests * Annotate more integration tests * Annotate journal system tests * Annotate more tests. * Annotate gas,head buffer behaviors solve merge conflict * Fix markset annotations * Annotate miner_api test in dagstore * Annotate more test files * doc: test annotations for the markets dagstore wrapper * Annotate wdpost system * Renamce "conformance" to "chaos_actor" tests * Annotate remaining "A" tests * doc: stm annotations for blockheader & election proof tests * annotate: stm for error_test * Annotate "b" file tests * memrepo_test.go * Annotate "c" file tests * message_test.go * Annotate "D" test files * doc: stm annotate for fsrepo_test * Annotate u,v,wl tests * message_test.go * doc: stm annotate for chain, node/config & client * docs: stm annotate node_test * Annotate "T" test files * doc: stm annotations for various test files * Add mempool unit tests solve merge conflict * doc: stm annotate for proxy_util_test & policy_test * doc: stm annotate for various tests * doc: final few stm annotations * Add two more memPool Add tests * Update submodules * Add check function tests solve conflict * Add stm annotations, refactor test helper solve merge conflict * Change CLI test kinds to "unit" * Fix double merged test * Fix ccupgrade_test merge * Fix lint issues * Add stm annotation to types_Test * Test vectors submodule * Add file annotation to burn_test Co-authored-by: Nikola Divic <divicnikola@gmail.com> Co-authored-by: TheMenko <themenkoprojects@gmail.com>
145 lines
3.7 KiB
Go
145 lines
3.7 KiB
Go
//stm: ignore
|
|
// This file does not test any behaviors by itself; rather, it runs other test files
|
|
// Therefore, this file should not be annotated.
|
|
package conformance
|
|
|
|
import (
|
|
"encoding/json"
|
|
"io/ioutil"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/filecoin-project/test-vectors/schema"
|
|
)
|
|
|
|
var invokees = map[schema.Class]func(Reporter, *schema.TestVector, *schema.Variant) ([]string, error){
|
|
schema.ClassMessage: ExecuteMessageVector,
|
|
schema.ClassTipset: ExecuteTipsetVector,
|
|
}
|
|
|
|
const (
|
|
// EnvSkipConformance, if 1, skips the conformance test suite.
|
|
EnvSkipConformance = "SKIP_CONFORMANCE"
|
|
|
|
// EnvCorpusRootDir is the name of the environment variable where the path
|
|
// to an alternative corpus location can be provided.
|
|
//
|
|
// The default is defaultCorpusRoot.
|
|
EnvCorpusRootDir = "CORPUS_DIR"
|
|
|
|
// defaultCorpusRoot is the directory where the test vector corpus is hosted.
|
|
// It is mounted on the Lotus repo as a git submodule.
|
|
//
|
|
// When running this test, the corpus root can be overridden through the
|
|
// -conformance.corpus CLI flag to run an alternate corpus.
|
|
defaultCorpusRoot = "../extern/test-vectors/corpus"
|
|
)
|
|
|
|
// ignore is a set of paths relative to root to skip.
|
|
var ignore = map[string]struct{}{
|
|
".git": {},
|
|
"schema.json": {},
|
|
}
|
|
|
|
// TestConformance is the entrypoint test that runs all test vectors found
|
|
// in the corpus root directory.
|
|
//
|
|
// It locates all json files via a recursive walk, skipping over the ignore set,
|
|
// as well as files beginning with _. It parses each file as a test vector, and
|
|
// runs it via the Driver.
|
|
func TestConformance(t *testing.T) {
|
|
if skip := strings.TrimSpace(os.Getenv(EnvSkipConformance)); skip == "1" {
|
|
t.SkipNow()
|
|
}
|
|
// corpusRoot is the effective corpus root path, taken from the `-conformance.corpus` CLI flag,
|
|
// falling back to defaultCorpusRoot if not provided.
|
|
corpusRoot := defaultCorpusRoot
|
|
if dir := strings.TrimSpace(os.Getenv(EnvCorpusRootDir)); dir != "" {
|
|
corpusRoot = dir
|
|
}
|
|
|
|
var vectors []string
|
|
err := filepath.Walk(corpusRoot+"/", func(path string, info os.FileInfo, err error) error {
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
filename := filepath.Base(path)
|
|
rel, err := filepath.Rel(corpusRoot, path)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if _, ok := ignore[rel]; ok {
|
|
// skip over using the right error.
|
|
if info.IsDir() {
|
|
return filepath.SkipDir
|
|
}
|
|
return nil
|
|
}
|
|
if info.IsDir() {
|
|
// dive into directories.
|
|
return nil
|
|
}
|
|
if filepath.Ext(path) != ".json" {
|
|
// skip if not .json.
|
|
return nil
|
|
}
|
|
if ignored := strings.HasPrefix(filename, "_"); ignored {
|
|
// ignore files starting with _.
|
|
t.Logf("ignoring: %s", rel)
|
|
return nil
|
|
}
|
|
vectors = append(vectors, rel)
|
|
return nil
|
|
})
|
|
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if len(vectors) == 0 {
|
|
t.Fatalf("no test vectors found")
|
|
}
|
|
|
|
// Run a test for each vector.
|
|
for _, v := range vectors {
|
|
path := filepath.Join(corpusRoot, v)
|
|
raw, err := ioutil.ReadFile(path)
|
|
if err != nil {
|
|
t.Fatalf("failed to read test raw file: %s", path)
|
|
}
|
|
|
|
var vector schema.TestVector
|
|
err = json.Unmarshal(raw, &vector)
|
|
if err != nil {
|
|
t.Errorf("failed to parse test vector %s: %s; skipping", path, err)
|
|
continue
|
|
}
|
|
|
|
t.Run(v, func(t *testing.T) {
|
|
for _, h := range vector.Hints {
|
|
if h == schema.HintIncorrect {
|
|
t.Logf("skipping vector marked as incorrect: %s", vector.Meta.ID)
|
|
t.SkipNow()
|
|
}
|
|
}
|
|
|
|
// dispatch the execution depending on the vector class.
|
|
invokee, ok := invokees[vector.Class]
|
|
if !ok {
|
|
t.Fatalf("unsupported test vector class: %s", vector.Class)
|
|
}
|
|
|
|
for _, variant := range vector.Pre.Variants {
|
|
variant := variant
|
|
t.Run(variant.ID, func(t *testing.T) {
|
|
_, _ = invokee(t, &vector, &variant) //nolint:errcheck
|
|
})
|
|
}
|
|
})
|
|
}
|
|
}
|