Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[R4Rfix testcase on slash and validator contract #6

Merged
merged 1 commit into from
Mar 2, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 3 additions & 8 deletions test/BSCValidatorSet.js
Original file line number Diff line number Diff line change
Expand Up @@ -723,14 +723,9 @@ contract('BSCValidatorSet', (accounts) => {
let outValidator = miningValidators.filter((addr)=>{
return !exceptValues.includes(addr);
});
for (var j=0;j<numOfCabinets-maxNumOfWorkingCandidates;j++){
assert.equal(exceptValues.includes(miningValidators[j]),true, "wrong cabinet validators")

}
extraValidators = [...outValidator, ...validators.slice(numOfCabinets,validators.length)]
for (var j=numOfCabinets-maxNumOfWorkingCandidates;j<numOfCabinets;j++){
assert.equal(extraValidators.includes(miningValidators[j]),true, "wrong extra validators")
}
// TODO, this is not always true, but as the epoch number is fixed during UT, the result is fixed.
assert(outValidator.length > 0, "no validator choose from candidates");
assert(outValidator.length <= maxNumOfWorkingCandidates, "too many working candidates" )

});
});
Expand Down
90 changes: 48 additions & 42 deletions test/Slash.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,67 +11,77 @@ const STAKE_CHANNEL_ID = 0x08;
contract('SlashIndicator', (accounts) => {
it('slash success', async () => {
const slashInstance = await SlashIndicator.deployed();
const validatorInstance = await BSCValidatorSet.deployed();

const accountOne = accounts[0];

let validatorAccount = web3.eth.accounts.create();

let validatorAccounts = await validatorInstance.getMiningValidators.call();
let validatorAccount = validatorAccounts[0];

for (let i =1; i<10; i++){
await slashInstance.slash(validatorAccount.address, { from: accountOne });
let res= (await slashInstance.getSlashIndicator.call(validatorAccount.address));
await slashInstance.slash(validatorAccount, { from: accountOne });
let res= (await slashInstance.getSlashIndicator.call(validatorAccount));
let count =res[1].toNumber();
assert.equal(count, i, "slash num is not correct");
}
});

it('slash from no system account', async () => {
const slashInstance = await SlashIndicator.deployed();
const validatorInstance = await BSCValidatorSet.deployed();

const nonSystemAccount = accounts[1];
let validatorAccount = web3.eth.accounts.create();

let validatorAccounts = await validatorInstance.getMiningValidators.call();
let validatorAccount = validatorAccounts[0];
// first slash
try{
await slashInstance.slash(validatorAccount.address, { from: nonSystemAccount });
await slashInstance.slash(validatorAccount, { from: nonSystemAccount });
assert.fail();
}catch (error) {
assert.ok(error.toString().includes("the message sender must be the block producer"), "slash from no system account should not be ok");
}
});
});

it('catch emit event', async () => {
const slashInstance = await SlashIndicator.deployed();

const accountOne = accounts[0];
let validatorAccount = web3.eth.accounts.create();
for (let i =1; i<50; i++){
let tx = await slashInstance.slash(validatorAccount.address, { from: accountOne });
truffleAssert.eventEmitted(tx, "validatorSlashed",(ev) => {
return ev.validator === validatorAccount.address;
});
}
});


contract('SlashIndicator: isOperator works', (accounts) => {
it('isOperator works', async () => {
const slashInstance = await SlashIndicator.deployed();
const validatorInstance = await BSCValidatorSet.deployed();

const accountOne = accounts[0];
let validatorAccount1 = web3.eth.accounts.create();
let validatorAccount2 = web3.eth.accounts.create();
let validatorAccounts = await validatorInstance.getMiningValidators.call();
let validatorAccount = validatorAccounts[0];

// slash afterward
for (let i =1; i<10; i++){
await slashInstance.slash(validatorAccount1.address, { from: accountOne });
let res= (await slashInstance.getSlashIndicator.call(validatorAccount1.address));
await slashInstance.slash(validatorAccount, { from: accountOne });
let res= (await slashInstance.getSlashIndicator.call(validatorAccount));
let count =res[1].toNumber();
assert.equal(count, i, "slash num is not correct for validator 1");

await slashInstance.slash(validatorAccount2.address, { from: accountOne });
res= (await slashInstance.getSlashIndicator.call(validatorAccount2.address));
count =res[1].toNumber();
assert.equal(count, i, "slash num is not correct for validator 2");
assert.equal(count, i, "slash num is not correct for validator");
}
});
});


contract('SlashIndicator: catch emit event', (accounts) => {
it('catch emit event', async () => {
const slashInstance = await SlashIndicator.deployed();
const validatorInstance = await BSCValidatorSet.deployed();

const accountOne = accounts[0];
let validatorAccounts = await validatorInstance.getMiningValidators.call();
let validatorAccount = validatorAccounts[0];
for (let i =1; i<50; i++){
let tx = await slashInstance.slash(validatorAccount, { from: accountOne });
truffleAssert.eventEmitted(tx, "validatorSlashed",(ev) => {
return ev.validator === validatorAccount;
});
}
});
});


contract('SlashIndicator', (accounts) => {
it('trigger misdemeanor', async () => {
const slashInstance = await SlashIndicator.deployed();
const validatorSetInstance = await BSCValidatorSet.deployed();
Expand Down Expand Up @@ -113,7 +123,6 @@ contract('SlashIndicator', (accounts) => {
assert.equal(amount.toString(),web3.utils.toBN(1e18).toString())
amount = await validatorSetInstance.getIncoming.call(thirdValidator);
assert.equal(amount.toString(),web3.utils.toBN(1e18).toString())



await validatorSetInstance.deposit(secondValidator, {from: systemAccount, value: 1e18 });
Expand Down Expand Up @@ -144,7 +153,6 @@ contract('SlashIndicator', (accounts) => {
assert.equal(amount.toNumber(),0);

});

});

contract('felony SlashIndicator', (accounts) => {
Expand Down Expand Up @@ -245,12 +253,16 @@ contract('Clean SlashIndicator', (accounts) => {
for(let i =0;i <20; i++){
validators.push(web3.eth.accounts.create().address);
}
// Do init
let packageBytes = validatorUpdateRlpEncode(validators,
validators,validators);
await validatorSetInstance.handleSynPackage(STAKE_CHANNEL_ID,packageBytes,{from: relayerAccount});

for(let i =0;i <20;i++){
await slashInstance.slash(validators[i], { from: accountOne });
}

// doclean
let packageBytes = validatorUpdateRlpEncode([newValidator.address],
[newValidator.address],[newValidator.address]);
await validatorSetInstance.handleSynPackage(STAKE_CHANNEL_ID,packageBytes,{from: relayerAccount});

let res= (await slashInstance.getSlashValidators.call());
Expand All @@ -271,8 +283,6 @@ contract('Clean SlashIndicator', (accounts) => {
}
}
// doclean
packageBytes = validatorUpdateRlpEncode([newValidator.address],
[newValidator.address],[newValidator.address]);
await validatorSetInstance.handleSynPackage(STAKE_CHANNEL_ID,packageBytes,{from: relayerAccount});
res= (await slashInstance.getSlashValidators.call());
assert.equal(res.length, 20);
Expand All @@ -290,8 +300,6 @@ contract('Clean SlashIndicator', (accounts) => {
await slashInstance.slash(validators[2*i+1], { from: accountOne });
}
// doclean
packageBytes = validatorUpdateRlpEncode([newValidator.address],
[newValidator.address],[newValidator.address]);
await validatorSetInstance.handleSynPackage(STAKE_CHANNEL_ID,packageBytes,{from: relayerAccount});
res= (await slashInstance.getSlashValidators.call());
assert.equal(res.length, 10);
Expand All @@ -313,8 +321,6 @@ contract('Clean SlashIndicator', (accounts) => {
await slashInstance.slash(validators[2*i], { from: accountOne });
}
// doclean
packageBytes = validatorUpdateRlpEncode([newValidator.address],
[newValidator.address],[newValidator.address]);
await validatorSetInstance.handleSynPackage(STAKE_CHANNEL_ID,packageBytes,{from: relayerAccount});
res= (await slashInstance.getSlashValidators.call());
assert.equal(res.length, 10);
Expand Down