Skip to content

Commit

Permalink
chore: add e2e test (#35)
Browse files Browse the repository at this point in the history
* Add e2e test

* Add vscode extension recommendation for working with github actions

* Fix linting error
  • Loading branch information
MexicanAce authored Aug 17, 2023
1 parent c860c9b commit f1a2efb
Show file tree
Hide file tree
Showing 13 changed files with 3,477 additions and 4 deletions.
17 changes: 16 additions & 1 deletion .github/workflows/checks.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -49,4 +49,19 @@ jobs:
uses: Swatinem/rust-cache@v2

- name: Build Code
run: make all
run: make all

- name: Create artifact
run: |
cd ./target/release
tar -czf era_test_node-${{ matrix.os }}.tar.gz ./era_test_node*
- name: Upload artifact
uses: actions/upload-artifact@v3
with:
name: era_test_node-${{ matrix.os }}.tar.gz
path: ./target/release/era_test_node-${{ matrix.os }}.tar.gz
e2e:
needs: build
uses: ./.github/workflows/e2e.yml
name: e2e-tests
48 changes: 48 additions & 0 deletions .github/workflows/e2e.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
name: Testing era_test_node using e2e
on:
workflow_call:

jobs:
e2e:
runs-on: ubuntu-latest
name: e2e
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0

- name: Download artifacts
uses: actions/download-artifact@v3
with:
name: era_test_node-ubuntu-latest.tar.gz

- name: Start the era_test_node
id: start_node
run: |
echo "Extracting era_test_node binary"
tar -xzf era_test_node-ubuntu-latest.tar.gz
chmod +x era_test_node
echo "Starting node in background"
./era_test_node run 2>&1 | tee era_test_node_ouput.log &
echo "PID=$!" >> $GITHUB_ENV
- name: Launch tests
id: launch
run: |
echo "Run tests"
make test-e2e
- name: Stop the era_test_node and print output logs
id: stop_node
if: always()
run: |
cat era_test_node_ouput.log
kill $PID
- name: Publish Test Results
uses: dorny/test-reporter@v1
if: always()
with:
path: ./e2e-tests/test-results.json
name: E2E Test Results
reporter: 'mocha-json'
3 changes: 2 additions & 1 deletion .vscode/extensions.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
"recommendations": [
"rust-lang.rust-analyzer",
"humao.rest-client",
"vadimcn.vscode-lldb"
"vadimcn.vscode-lldb",
"github.vscode-github-actions"
],
}
6 changes: 5 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,10 @@ lint-fix:
test:
cargo test

# Run e2e tests against running era_test_node
test-e2e:
./scripts/execute-e2e-tests.sh

# Build everything
all: build-contracts rust-build

Expand All @@ -52,4 +56,4 @@ new-release-tag:
echo "\n\033[0;32mGit tag creation SUCCESSFUL! Use the following command to push the tag:\033[0m" && \
echo "git push origin v$$VERSION_NUMBER"

.PHONY: build-contracts clean-contracts rebuild-contracts rust-build lint test all clean build-% new-release-tag
.PHONY: build-contracts clean-contracts rebuild-contracts rust-build lint test test-e2e all clean build-% new-release-tag
117 changes: 117 additions & 0 deletions e2e-tests/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
# nmv 08-08-2023
# Ignore test results from mocha
test-results.json

# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
.vscode

# hardhat artifacts
artifacts
cache

# zksync artifacts
artifacts-zk
cache-zk

# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json

# Runtime data
pids
*.pid
*.seed
*.pid.lock

# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov

# Coverage directory used by tools like istanbul
coverage
*.lcov

# nyc test coverage
.nyc_output

# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt

# Bower dependency directory (https://bower.io/)
bower_components

# node-waf configuration
.lock-wscript

# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release

# Dependency directories
node_modules/
jspm_packages/

# TypeScript v1 declaration files
typings/

# TypeScript cache
*.tsbuildinfo

# Optional npm cache directory
.npm

# Optional eslint cache
.eslintcache

# Microbundle cache
.rpt2_cache/
.rts2_cache_cjs/
.rts2_cache_es/
.rts2_cache_umd/

# Optional REPL history
.node_repl_history

# Output of 'npm pack'
*.tgz

# Yarn Integrity file
.yarn-integrity

# dotenv environment variables file
.env
.env.test

# parcel-bundler cache (https://parceljs.org/)
.cache

# Next.js build output
.next

# Nuxt.js build / generate output
.nuxt
dist

# Gatsby files
.cache/
# Comment in the public line in if your project uses Gatsby and *not* Next.js
# https://nextjs.org/blog/next-9-1#public-directory-support
# public

# vuepress build output
.vuepress/dist

# Serverless directories
.serverless/

# FuseBox cache
.fusebox/

# DynamoDB Local files
.dynamodb/

# TernJS port file
.tern-port
14 changes: 14 additions & 0 deletions e2e-tests/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# Era Test Node E2E Tests project

This project is used for running e2e tests against `era_test_node`

## Project structure

- `/contracts`: smart contracts.
- `/test`: test files
- `hardhat.config.ts`: configuration file.

## Commands

- `yarn hardhat compile` will compile the contracts.
- `yarn test`: run tests.
26 changes: 26 additions & 0 deletions e2e-tests/contracts/Greeter.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.0;

import "hardhat/console.sol";

contract Greeter {
string private greeting;

constructor(string memory _greeting) {
greeting = _greeting;
}

function greet() public view returns (string memory) {
return greeting;
}

function setGreeting(string memory _greeting) public {
console.log("setGreeting called");
console.log(_greeting);
require(
keccak256(abi.encodePacked((_greeting))) != keccak256(abi.encodePacked(("test"))),
"Received a test value"
);
greeting = _greeting;
}
}
34 changes: 34 additions & 0 deletions e2e-tests/hardhat.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import { HardhatUserConfig } from "hardhat/config";

import "@matterlabs/hardhat-zksync-deploy";
import "@matterlabs/hardhat-zksync-solc";

const config: HardhatUserConfig = {
zksolc: {
version: "latest",
settings: {},
},
defaultNetwork: "zkSyncTestnet",
networks: {
zkSyncTestnet: {
// Using 127.0.0.1 instead of localhost is necessary for CI builds
url: "http://127.0.0.1:8011",
// ethNetwork isn't necessary, but leaving for posterity
ethNetwork: "http://127.0.0.1:8545",
zksync: true,
}
},
solidity: {
version: "0.8.17",
},
mocha: {
// Multiple reports allow view of the ouput in the console and as a JSON for the test result exporter in CI
reporter: "mocha-multi",
reporterOptions: {
"spec": "-",
"json": "test-results.json"
}
}
};

export default config;
25 changes: 25 additions & 0 deletions e2e-tests/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{
"name": "era-test-node-e2e-tests",
"version": "1.0.0",
"main": "index.js",
"author": "The Matter Labs Team <[email protected]>",
"license": "MIT",
"devDependencies": {
"@matterlabs/hardhat-zksync-deploy": "^0.6.3",
"@matterlabs/hardhat-zksync-solc": "^0.4.0",
"@nomiclabs/hardhat-etherscan": "^3.1.7",
"@types/chai": "^4.3.4",
"@types/mocha": "^10.0.1",
"chai": "^4.3.7",
"ethers": "^5.7.2",
"hardhat": "^2.12.4",
"mocha": "^10.2.0",
"mocha-multi": "^1.1.7",
"ts-node": "^10.9.1",
"typescript": "^4.9.4",
"zksync-web3": "^0.14.3"
},
"scripts": {
"test": "hardhat test --network zkSyncTestnet"
}
}
29 changes: 29 additions & 0 deletions e2e-tests/test/main.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import { expect } from 'chai';
import { Wallet, Contract } from 'zksync-web3';
import * as hre from 'hardhat';
import { Deployer } from '@matterlabs/hardhat-zksync-deploy';

const RICH_WALLET_PK =
'0x7726827caac94a7f9e1b160f7ea819f172f7b6f9d2a97f992c38edeab82d4110';

async function deployGreeter(deployer: Deployer): Promise<Contract> {
const artifact = await deployer.loadArtifact('Greeter');
return await deployer.deploy(artifact, ['Hi']);
}

describe('Greeter', function () {
it("Should return the new greeting once it's changed", async function () {
const wallet = new Wallet(RICH_WALLET_PK);
const deployer = new Deployer(hre, wallet);

const greeter = await deployGreeter(deployer);

expect(await greeter.greet()).to.eq('Hi');

const setGreetingTx = await greeter.setGreeting('Hola, mundo!');
// wait until the transaction is mined
await setGreetingTx.wait();

expect(await greeter.greet()).to.equal('Hola, mundo!');
});
});
Loading

0 comments on commit f1a2efb

Please sign in to comment.