fix linking tests
This commit is contained in:
parent
60fc16dea8
commit
5cc853d807
|
@ -155,7 +155,6 @@ func testLinkCase(t *testing.T, tcInput linkTestCaseInput) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestContractLinking(t *testing.T) {
|
func TestContractLinking(t *testing.T) {
|
||||||
|
|
||||||
testLinkCase(t, linkTestCaseInput{
|
testLinkCase(t, linkTestCaseInput{
|
||||||
map[rune][]rune{
|
map[rune][]rune{
|
||||||
'a': {'b', 'c', 'd', 'e'}},
|
'a': {'b', 'c', 'd', 'e'}},
|
||||||
|
@ -240,14 +239,15 @@ func TestContractLinking(t *testing.T) {
|
||||||
map[rune]struct{}{'a': {}},
|
map[rune]struct{}{'a': {}},
|
||||||
map[rune]struct{}{}})
|
map[rune]struct{}{}})
|
||||||
|
|
||||||
// two contracts share some dependencies. one contract is marked as an override. all dependencies for the non-override
|
// two contracts share some dependencies. one contract is marked as an override. only the override contract
|
||||||
// contract will be deployed
|
// is not deployed. its dependencies are all deployed (even the ones not used by f), and the ones shared with f
|
||||||
|
// are not redeployed
|
||||||
testLinkCase(t, linkTestCaseInput{map[rune][]rune{
|
testLinkCase(t, linkTestCaseInput{map[rune][]rune{
|
||||||
'a': {'b', 'c', 'd', 'e'},
|
'a': {'b', 'c', 'd', 'e'},
|
||||||
'f': {'g', 'c', 'd', 'h'}},
|
'f': {'g', 'c', 'd', 'h'}},
|
||||||
map[rune]struct{}{'a': {}},
|
map[rune]struct{}{'a': {}},
|
||||||
map[rune]struct{}{
|
map[rune]struct{}{
|
||||||
'f': {}, 'g': {}, 'c': {}, 'd': {}, 'h': {},
|
'b': {}, 'c': {}, 'd': {}, 'e': {}, 'f': {}, 'g': {}, 'h': {},
|
||||||
}})
|
}})
|
||||||
|
|
||||||
// test nested libraries that share deps at different levels of the tree... with override.
|
// test nested libraries that share deps at different levels of the tree... with override.
|
||||||
|
@ -260,7 +260,7 @@ func TestContractLinking(t *testing.T) {
|
||||||
'i': {},
|
'i': {},
|
||||||
},
|
},
|
||||||
map[rune]struct{}{
|
map[rune]struct{}{
|
||||||
'a': {}, 'b': {}, 'c': {}, 'd': {}, 'e': {}, 'f': {}, 'g': {}, 'h': {}, 'm': {},
|
'a': {}, 'b': {}, 'c': {}, 'd': {}, 'e': {}, 'f': {}, 'g': {}, 'h': {}, 'j': {}, 'k': {}, 'l': {}, 'm': {},
|
||||||
}})
|
}})
|
||||||
// TODO: same as the above case but nested one level of dependencies deep (?)
|
// TODO: same as the above case but nested one level of dependencies deep (?)
|
||||||
}
|
}
|
||||||
|
|
|
@ -95,7 +95,13 @@ func (d *depTreeBuilder) buildDepTrees(pattern, contract string) {
|
||||||
if _, ok := d.subtrees[depPattern]; ok {
|
if _, ok := d.subtrees[depPattern]; ok {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
if _, ok := d.overrides[depPattern]; ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// this library was referenced by another contract. it's not a dependency tree root.
|
||||||
delete(d.roots, depPattern)
|
delete(d.roots, depPattern)
|
||||||
|
|
||||||
d.buildDepTrees(depPattern, d.contracts[depPattern])
|
d.buildDepTrees(depPattern, d.contracts[depPattern])
|
||||||
node.nodes = append(node.nodes, d.subtrees[depPattern])
|
node.nodes = append(node.nodes, d.subtrees[depPattern])
|
||||||
}
|
}
|
||||||
|
@ -103,25 +109,16 @@ func (d *depTreeBuilder) buildDepTrees(pattern, contract string) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *depTreeBuilder) BuildDepTrees() (roots []*depTreeNode) {
|
func (d *depTreeBuilder) BuildDepTrees() (roots []*depTreeNode) {
|
||||||
for pattern, _ := range d.contracts {
|
|
||||||
d.roots[pattern] = struct{}{}
|
|
||||||
}
|
|
||||||
for pattern, contract := range d.contracts {
|
for pattern, contract := range d.contracts {
|
||||||
if _, ok := d.subtrees[pattern]; ok {
|
if _, ok := d.subtrees[pattern]; ok {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
reMatchSpecificPattern, err := regexp.Compile("__\\$([a-f0-9]+)\\$__")
|
if _, ok := d.overrides[pattern]; ok {
|
||||||
if err != nil {
|
continue
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
for _, match := range reMatchSpecificPattern.FindAllStringSubmatch(contract, -1) {
|
|
||||||
depPattern := match[1]
|
|
||||||
delete(d.roots, depPattern)
|
|
||||||
if _, ok := d.subtrees[depPattern]; ok {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
d.buildDepTrees(depPattern, d.contracts[depPattern])
|
|
||||||
}
|
}
|
||||||
|
// pattern has not been explored, it's potentially a root
|
||||||
|
d.roots[pattern] = struct{}{}
|
||||||
|
d.buildDepTrees(pattern, contract)
|
||||||
}
|
}
|
||||||
for pattern, _ := range d.roots {
|
for pattern, _ := range d.roots {
|
||||||
roots = append(roots, d.subtrees[pattern])
|
roots = append(roots, d.subtrees[pattern])
|
||||||
|
@ -184,16 +181,21 @@ func LinkAndDeploy(deployParams DeploymentParams, deploy func(input, deployer []
|
||||||
treeBuilder := depTreeBuilder{
|
treeBuilder := depTreeBuilder{
|
||||||
overrides: deployParams.Overrides,
|
overrides: deployParams.Overrides,
|
||||||
contracts: unlinkedContracts,
|
contracts: unlinkedContracts,
|
||||||
|
subtrees: make(map[string]*depTreeNode),
|
||||||
|
roots: make(map[string]struct{}),
|
||||||
}
|
}
|
||||||
|
|
||||||
deps := treeBuilder.BuildDepTrees()
|
deps := treeBuilder.BuildDepTrees()
|
||||||
for _, tr := range deps {
|
for _, tr := range deps {
|
||||||
// TODO: instantiate deployer with its tree?
|
// TODO: instantiate deployer with its tree?
|
||||||
|
|
||||||
deployer := treeDeployer{
|
deployer := treeDeployer{
|
||||||
deploy: deploy,
|
deploy: deploy,
|
||||||
deployedAddrs: make(map[string]common.Address),
|
deployedAddrs: make(map[string]common.Address),
|
||||||
deployerTxs: make(map[string]*types.Transaction),
|
deployerTxs: make(map[string]*types.Transaction)}
|
||||||
input: map[string][]byte{tr.pattern: deployParams.Inputs[tr.pattern]}}
|
if deployParams.Inputs != nil {
|
||||||
|
deployer.input = map[string][]byte{tr.pattern: deployParams.Inputs[tr.pattern]}
|
||||||
|
}
|
||||||
deployer.linkAndDeploy(tr)
|
deployer.linkAndDeploy(tr)
|
||||||
res, err := deployer.Result()
|
res, err := deployer.Result()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
Loading…
Reference in New Issue