2022-08-29 14:25:30 +00:00
|
|
|
// stm: ignore
|
feat: Add additional test annotations (#8272)
* 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>
2022-03-16 17:37:34 +00:00
|
|
|
// This file does not test any behaviors by itself; rather, it runs other test files
|
|
|
|
// Therefore, this file should not be annotated.
|
2020-09-27 19:10:05 +00:00
|
|
|
package conformance
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
|
|
|
"os"
|
|
|
|
"path/filepath"
|
|
|
|
"strings"
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/filecoin-project/test-vectors/schema"
|
|
|
|
)
|
|
|
|
|
2020-12-16 21:40:37 +00:00
|
|
|
var invokees = map[schema.Class]func(Reporter, *schema.TestVector, *schema.Variant) ([]string, error){
|
2020-10-13 22:00:01 +00:00
|
|
|
schema.ClassMessage: ExecuteMessageVector,
|
|
|
|
schema.ClassTipset: ExecuteTipsetVector,
|
|
|
|
}
|
|
|
|
|
2020-09-27 19:10:05 +00:00
|
|
|
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)
|
2023-03-29 19:24:07 +00:00
|
|
|
raw, err := os.ReadFile(path)
|
2020-09-27 19:10:05 +00:00
|
|
|
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.
|
2020-10-13 22:00:01 +00:00
|
|
|
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) {
|
2020-12-16 21:40:37 +00:00
|
|
|
_, _ = invokee(t, &vector, &variant) //nolint:errcheck
|
2020-10-13 22:00:01 +00:00
|
|
|
})
|
2020-09-27 19:10:05 +00:00
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|