Răsfoiți Sursa

Tilt tests (#688)

* tests run in tilt / ci

* changed bridge_ui test process

* tests use kube proxy when in ci

* fix: allTests.sh permission

* fix: bridge_ui dockerfile sha for amd64

* fix: bridge_ui should use cra test

* fix: ci tests

Co-authored-by: Evan Gray <battledingo@gmail.com>
chase-45 3 ani în urmă
părinte
comite
28c713a6dd

+ 26 - 2
Tiltfile

@@ -39,6 +39,7 @@ config.define_bool("pyth", False, "Enable Pyth-to-Wormhole component")
 config.define_bool("explorer", False, "Enable explorer component")
 config.define_bool("bridge_ui", False, "Enable bridge UI component")
 config.define_bool("e2e", False, "Enable E2E testing stack")
+config.define_bool("ci_tests", False, "Enable tests runner component")
 
 cfg = config.parse()
 num_guardians = int(cfg.get("num", "1"))
@@ -51,6 +52,7 @@ pyth = cfg.get("pyth", ci)
 explorer = cfg.get("explorer", ci)
 bridge_ui = cfg.get("bridge_ui", ci)
 e2e = cfg.get("e2e", ci)
+ci_tests = cfg.get("ci_tests", ci)
 
 if cfg.get("manual", False):
     trigger_mode = TRIGGER_MODE_MANUAL
@@ -280,7 +282,7 @@ if bridge_ui:
     docker_build(
         ref = "bridge-ui",
         context = ".",
-        only = ["./ethereum", "./sdk", "./bridge_ui"],
+        only = ["./bridge_ui"],
         dockerfile = "bridge_ui/Dockerfile",
         live_update = [
             sync("./bridge_ui/src", "/app/bridge_ui/src"),
@@ -291,13 +293,35 @@ if bridge_ui:
 
     k8s_resource(
         "bridge-ui",
-        resource_deps = ["proto-gen-web", "wasm-gen"],
+        resource_deps = [],
         port_forwards = [
             port_forward(3000, name = "Bridge UI [:3000]", host = webHost),
         ],
         trigger_mode = trigger_mode,
     )
 
+if ci_tests:
+    docker_build(
+        ref = "tests-image",
+        context = ".",
+        dockerfile = "testing/Dockerfile.tests",
+        only = [],
+        live_update = [
+            sync("./spydk/js/src", "/app/spydk/js/src"),
+            sync("./sdk/js/src", "/app/sdk/js/src"),
+            sync("./testing", "/app/testing"),
+            sync("./bridge_ui/src", "/app/bridge_ui/src"),
+        ],
+    )
+
+    k8s_yaml_with_ns("devnet/tests.yaml")
+
+    k8s_resource(
+        "ci-tests",
+        resource_deps = ["eth-devnet", "eth-devnet2", "terra-terrad", "terra-fcd", "solana-devnet", "spy", "guardian"],
+        trigger_mode = trigger_mode,
+    )
+
 # algorand
 k8s_yaml_with_ns("devnet/algorand.yaml")
 

+ 0 - 1
bridge_ui/.env.sample

@@ -1 +0,0 @@
-REACT_APP_COVALENT_API_KEY=

+ 8 - 7
bridge_ui/Dockerfile

@@ -1,19 +1,20 @@
 # syntax=docker.io/docker/dockerfile:1.3@sha256:42399d4635eddd7a9b8a24be879d2f9a930d0ed040a61324cfdf59ef1357b3b2
 
 # Derivative of ethereum/Dockerfile, look there for an explanation on how it works.
-FROM node:16-alpine@sha256:004dbac84fed48e20f9888a23e32fa7cf83c2995e174a78d41d9a9dd1e051a20
+FROM node:16-alpine@sha256:f21f35732964a96306a84a8c4b5a829f6d3a0c5163237ff4b6b8b34f8d70064b
 
 RUN mkdir -p /app
 WORKDIR /app
 
 ADD . .
 
-RUN --mount=type=cache,uid=1000,gid=1000,target=/home/node/.npm \
-  npm ci --prefix ethereum
-RUN --mount=type=cache,uid=1000,gid=1000,target=/home/node/.npm \
-  npm ci --prefix sdk/js
-RUN --mount=type=cache,uid=1000,gid=1000,target=/home/node/.npm \
-  npm run build --prefix sdk/js
+# these are only needed if you are using the local version of the sdk (npm i ../sdk/js)
+# RUN --mount=type=cache,uid=1000,gid=1000,target=/home/node/.npm \
+#   npm ci --prefix ethereum
+# RUN --mount=type=cache,uid=1000,gid=1000,target=/home/node/.npm \
+#   npm ci --prefix sdk/js
+# RUN --mount=type=cache,uid=1000,gid=1000,target=/home/node/.npm \
+#   npm run build --prefix sdk/js
 
 
 WORKDIR ./bridge_ui

Fișier diff suprimat deoarece este prea mare
+ 489 - 90
bridge_ui/package-lock.json


+ 3 - 0
bridge_ui/package.json

@@ -75,6 +75,9 @@
     "@types/node": "^16.6.1",
     "@types/numeral": "^2.0.2",
     "@types/react-router-dom": "^5.1.8",
+    "babel-jest": "^26.6.0",
+    "jest": "^26.6.0",
+    "jest-watch-typeahead": "^0.6.4",
     "prettier": "^2.3.2",
     "truffle": "^5.4.1",
     "wasm-loader": "^1.3.0"

+ 13 - 0
bridge_ui/src/__tests__/sdk.js

@@ -0,0 +1,13 @@
+const { describe, expect, it } = require("@jest/globals");
+const fs = require("fs");
+
+describe("SDK installation", () => {
+  it("does not import from file path", () => {
+    const packageFile = fs.readFileSync("./package.json");
+    const packageObj = JSON.parse(packageFile.toString());
+
+    const sdkInstallation =
+      packageObj?.dependencies?.["@certusone/wormhole-sdk"];
+    expect(sdkInstallation && !sdkInstallation.includes("file")).toBe(true);
+  });
+});

+ 24 - 0
devnet/tests.yaml

@@ -0,0 +1,24 @@
+kind: Job
+apiVersion: batch/v1
+metadata:
+  name: ci-tests
+spec:
+  backoffLimit: 0
+  template:
+    spec:
+      restartPolicy: Never
+      containers:
+        - name: ci-tests
+          image: tests-image
+          command:
+            - /bin/sh
+            - -c
+            - "sh /app/testing/allTests.sh && touch /app/testing/success"
+          readinessProbe:
+            exec:
+              command:
+                - test
+                - -e
+                - "/app/testing/success"
+            initialDelaySeconds: 5
+            periodSeconds: 5

+ 3 - 0
sdk/js/ci-config.js

@@ -0,0 +1,3 @@
+process.env.CI = true;
+
+export default {};

+ 2 - 1
sdk/js/jestconfig.json

@@ -3,5 +3,6 @@
     "^.+\\.(t|j)sx?$": "ts-jest"
   },
   "testRegex": "(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$",
-  "moduleFileExtensions": ["ts", "tsx", "js", "jsx", "json", "node"]
+  "moduleFileExtensions": ["ts", "tsx", "js", "jsx", "json", "node"],
+  "testTimeout": 60000
 }

+ 2 - 2
sdk/js/package-lock.json

@@ -1,12 +1,12 @@
 {
   "name": "@certusone/wormhole-sdk",
-  "version": "0.1.4",
+  "version": "0.1.5",
   "lockfileVersion": 2,
   "requires": true,
   "packages": {
     "": {
       "name": "@certusone/wormhole-sdk",
-      "version": "0.1.4",
+      "version": "0.1.5",
       "license": "Apache-2.0",
       "dependencies": {
         "@improbable-eng/grpc-web": "^0.14.0",

+ 1 - 0
sdk/js/package.json

@@ -16,6 +16,7 @@
     "build-lib": "tsc -p tsconfig.json && tsc -p tsconfig-cjs.json && node scripts/copyEthersTypes.js && node scripts/copyWasm.js",
     "build-all": "npm run build-deps && npm run build-lib",
     "test": "jest --config jestconfig.json --verbose",
+    "test-ci": "jest --config jestconfig.json --verbose --setupFiles ./ci-config.js --forceExit",
     "build": "npm run build-all",
     "format": "echo \"disabled: prettier --write \"src/**/*.ts\"\"",
     "lint": "tslint -p tsconfig.json",

+ 15 - 5
sdk/js/src/nft_bridge/__tests__/consts.ts

@@ -1,15 +1,19 @@
 import { describe, expect, it } from "@jest/globals";
 import { Connection, PublicKey } from "@solana/web3.js";
 
+const ci = !!process.env.CI;
+
 // see devnet.md
-export const ETH_NODE_URL = "ws://localhost:8545";
+export const ETH_NODE_URL = ci ? "ws://eth-devnet:8545" : "ws://localhost:8545";
 export const ETH_PRIVATE_KEY =
   "0x6cbed15c793ce57650b9877cf6fa156fbef513c4e6134f022a85b1ffdd59b2a1"; // account 1
 export const ETH_CORE_BRIDGE_ADDRESS =
   "0xC89Ce4735882C9F0f0FE26686c53074E09B0D550";
 export const ETH_NFT_BRIDGE_ADDRESS =
   "0x26b4afb60d6c903165150c6f0aa14f8016be4aec";
-export const SOLANA_HOST = "http://localhost:8899";
+export const SOLANA_HOST = ci
+  ? "http://solana-devnet:8899"
+  : "http://localhost:8899";
 export const SOLANA_PRIVATE_KEY = new Uint8Array([
   14, 173, 153, 4, 176, 224, 201, 111, 32, 237, 183, 185, 159, 247, 22, 161, 89,
   84, 215, 209, 212, 137, 10, 92, 157, 49, 29, 192, 101, 164, 152, 70, 87, 65,
@@ -20,9 +24,13 @@ export const SOLANA_CORE_BRIDGE_ADDRESS =
   "Bridge1p5gheXUvJ6jGWGeCsgPKgnE3YgdGKRVCMY9o";
 export const SOLANA_NFT_BRIDGE_ADDRESS =
   "NFTWqJR8YnRVqPDvTJrYuLrQDitTG5AScqbeghi4zSA";
-export const TERRA_NODE_URL = "http://localhost:1317";
+export const TERRA_NODE_URL = ci
+  ? "http://terra-terrad:1317"
+  : "http://localhost:1317";
 export const TERRA_CHAIN_ID = "localterra";
-export const TERRA_GAS_PRICES_URL = "http://localhost:3060/v1/txs/gas_prices";
+export const TERRA_GAS_PRICES_URL = ci
+  ? "http://terra-fcd:3060/v1/txs/gas_prices"
+  : "http://localhost:3060/v1/txs/gas_prices";
 export const TERRA_CORE_BRIDGE_ADDRESS =
   "terra18vd8fpwxzck93qlwghaj6arh4p7c5n896xzem5";
 export const TERRA_NFT_BRIDGE_ADDRESS =
@@ -33,7 +41,9 @@ export const TEST_ERC721 = "0x5b9b42d6e4B2e4Bf8d42Eba32D46918e10899B66";
 export const TERRA_CW721_CODE_ID = 8;
 export const TEST_CW721 = "terra1l425neayde0fzfcv3apkyk4zqagvflm6cmha9v";
 export const TEST_SOLANA_TOKEN = "BVxyYhm498L79r4HMQ9sxZ5bi41DmJmeWZ7SCS7Cyvna";
-export const WORMHOLE_RPC_HOSTS = ["http://localhost:7071"];
+export const WORMHOLE_RPC_HOSTS = ci
+  ? ["http://guardian:7071"]
+  : ["http://localhost:7071"];
 
 describe("consts should exist", () => {
   it("has Solana test token", () => {

+ 15 - 5
sdk/js/src/token_bridge/__tests__/consts.ts

@@ -1,15 +1,19 @@
 import { describe, expect, it } from "@jest/globals";
 import { Connection, PublicKey } from "@solana/web3.js";
 
+const ci = !!process.env.CI;
+
 // see devnet.md
-export const ETH_NODE_URL = "ws://localhost:8545";
+export const ETH_NODE_URL = ci ? "ws://eth-devnet:8545" : "ws://localhost:8545";
 export const ETH_PRIVATE_KEY =
   "0x4f3edf983ac636a65a842ce7c78d9aa706d3b113bce9c46f30d7d21715b23b1d";
 export const ETH_CORE_BRIDGE_ADDRESS =
   "0xC89Ce4735882C9F0f0FE26686c53074E09B0D550";
 export const ETH_TOKEN_BRIDGE_ADDRESS =
   "0x0290FB167208Af455bB137780163b7B7a9a10C16";
-export const SOLANA_HOST = "http://localhost:8899";
+export const SOLANA_HOST = ci
+  ? "http://solana-devnet:8899"
+  : "http://localhost:8899";
 export const SOLANA_PRIVATE_KEY = new Uint8Array([
   14, 173, 153, 4, 176, 224, 201, 111, 32, 237, 183, 185, 159, 247, 22, 161, 89,
   84, 215, 209, 212, 137, 10, 92, 157, 49, 29, 192, 101, 164, 152, 70, 87, 65,
@@ -20,9 +24,13 @@ export const SOLANA_CORE_BRIDGE_ADDRESS =
   "Bridge1p5gheXUvJ6jGWGeCsgPKgnE3YgdGKRVCMY9o";
 export const SOLANA_TOKEN_BRIDGE_ADDRESS =
   "B6RHG3mfcckmrYN1UhmJzyS1XX3fZKbkeUcpJe9Sy3FE";
-export const TERRA_NODE_URL = "http://localhost:1317";
+export const TERRA_NODE_URL = ci
+  ? "http://terra-terrad:1317"
+  : "http://localhost:1317";
 export const TERRA_CHAIN_ID = "localterra";
-export const TERRA_GAS_PRICES_URL = "http://localhost:3060/v1/txs/gas_prices";
+export const TERRA_GAS_PRICES_URL = ci
+  ? "http://terra-fcd:3060/v1/txs/gas_prices"
+  : "http://localhost:3060/v1/txs/gas_prices";
 export const TERRA_CORE_BRIDGE_ADDRESS =
   "terra18vd8fpwxzck93qlwghaj6arh4p7c5n896xzem5";
 export const TERRA_TOKEN_BRIDGE_ADDRESS =
@@ -31,7 +39,9 @@ export const TERRA_PRIVATE_KEY =
   "notice oak worry limit wrap speak medal online prefer cluster roof addict wrist behave treat actual wasp year salad speed social layer crew genius";
 export const TEST_ERC20 = "0x2D8BE6BF0baA74e0A907016679CaE9190e80dD0A";
 export const TEST_SOLANA_TOKEN = "2WDq7wSs9zYrpx2kbHDA4RUTRch2CCTP6ZWaH4GNfnQQ";
-export const WORMHOLE_RPC_HOSTS = ["http://localhost:7071"];
+export const WORMHOLE_RPC_HOSTS = ci
+  ? ["http://guardian:7071"]
+  : ["http://localhost:7071"];
 
 describe("consts should exist", () => {
   it("has Solana test token", () => {

+ 3 - 0
spydk/js/ci-config.js

@@ -0,0 +1,3 @@
+process.env.CI = true;
+
+export default {};

+ 1 - 0
spydk/js/package.json

@@ -13,6 +13,7 @@
     "build-lib": "tsc -p tsconfig.json && tsc -p tsconfig-cjs.json",
     "build-all": "npm run build-lib",
     "test": "jest --config jestconfig.json --verbose",
+    "test-ci": "jest --config jestconfig.json --verbose --setupFiles ./ci-config.js --forceExit",
     "build": "npm run build-all",
     "format": "echo \"disabled: prettier --write \"src/**/*.ts\"\"",
     "lint": "tslint -p tsconfig.json",

+ 5 - 3
spydk/js/src/__tests__/integration.ts

@@ -7,8 +7,10 @@ import { createSpyRPCServiceClient, subscribeSignedVAA } from "..";
 setDefaultWasm("node");
 
 jest.setTimeout(60000);
-
-const SOLANA_HOST = "http://localhost:8899";
+const ci = !!process.env.CI;
+export const SOLANA_HOST = ci
+  ? "http://solana-devnet:8899"
+  : "http://localhost:8899";
 const SOLANA_PRIVATE_KEY = new Uint8Array([
   14, 173, 153, 4, 176, 224, 201, 111, 32, 237, 183, 185, 159, 247, 22, 161, 89,
   84, 215, 209, 212, 137, 10, 92, 157, 49, 29, 192, 101, 164, 152, 70, 87, 65,
@@ -19,7 +21,7 @@ const SOLANA_CORE_BRIDGE_ADDRESS =
   "Bridge1p5gheXUvJ6jGWGeCsgPKgnE3YgdGKRVCMY9o";
 const SOLANA_TOKEN_BRIDGE_ADDRESS =
   "B6RHG3mfcckmrYN1UhmJzyS1XX3fZKbkeUcpJe9Sy3FE";
-const SPYMASTER = "localhost:7072";
+const SPYMASTER = ci ? "spy:7072" : "localhost:7072";
 const TEST_SOLANA_TOKEN = "2WDq7wSs9zYrpx2kbHDA4RUTRch2CCTP6ZWaH4GNfnQQ";
 
 test("Can spy on messages", (done) => {

+ 27 - 0
testing/Dockerfile.tests

@@ -0,0 +1,27 @@
+FROM node:16-alpine@sha256:004dbac84fed48e20f9888a23e32fa7cf83c2995e174a78d41d9a9dd1e051a20
+
+RUN mkdir -p /app
+WORKDIR /app
+
+ADD . .
+
+RUN --mount=type=cache,uid=1000,gid=1000,target=/home/node/.npm \
+  npm ci --prefix ethereum
+
+RUN --mount=type=cache,uid=1000,gid=1000,target=/home/node/.npm \
+  npm ci --prefix sdk/js
+RUN --mount=type=cache,uid=1000,gid=1000,target=/home/node/.npm \
+  npm run build --prefix sdk/js
+
+RUN --mount=type=cache,uid=1000,gid=1000,target=/home/node/.npm \
+  npm ci --prefix spydk/js
+RUN --mount=type=cache,uid=1000,gid=1000,target=/home/node/.npm \
+  npm run build  --prefix spydk/js
+
+RUN --mount=type=cache,uid=1000,gid=1000,target=/home/node/.npm \
+  npm ci --prefix bridge_ui
+
+
+WORKDIR ./testing
+
+

+ 5 - 0
testing/allTests.sh

@@ -0,0 +1,5 @@
+#!/bin/sh
+set -e
+CI=true npm --prefix ../sdk/js run test-ci
+CI=true npm --prefix ../spydk/js run test-ci 
+CI=true npm --prefix ../bridge_ui run test 

Unele fișiere nu au fost afișate deoarece prea multe fișiere au fost modificate în acest diff