Skip to content

Commit

Permalink
Add KillTest e2e (#414)
Browse files Browse the repository at this point in the history
  • Loading branch information
igalshilman authored Aug 8, 2024
1 parent e3341c0 commit 8b008ea
Show file tree
Hide file tree
Showing 5 changed files with 168 additions and 0 deletions.
122 changes: 122 additions & 0 deletions .github/workflows/integration.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
name: Integration

# Controls when the workflow will run
on:
pull_request:
push:
branches:
- main
schedule:
- cron: "0 */6 * * *" # Every 6 hours
workflow_dispatch:
inputs:
restateCommit:
description: "restate commit"
required: false
default: ""
type: string
restateImage:
description: "restate image, superseded by restate commit"
required: false
default: "ghcr.io/restatedev/restate:main"
type: string
workflow_call:
inputs:
restateCommit:
description: "restate commit"
required: false
default: ""
type: string
restateImage:
description: "restate image, superseded by restate commit"
required: false
default: "ghcr.io/restatedev/restate:main"
type: string

jobs:
sdk-test-suite:
if: github.repository_owner == 'restatedev'
runs-on: ubuntu-latest
name: "Features integration test (sdk-test-suite version ${{ matrix.sdk-test-suite }})"
strategy:
matrix:
sdk-test-suite: ["1.5"]
permissions:
contents: read
issues: read
checks: write
pull-requests: write
actions: read

steps:
- uses: actions/checkout@v4
with:
repository: restatedev/sdk-typescript

### Download the Restate container image, if needed
# Setup restate snapshot if necessary
# Due to https://github.com/actions/upload-artifact/issues/53
# We must use download-artifact to get artifacts created during *this* workflow run, ie by workflow call
- name: Download restate snapshot from in-progress workflow
if: ${{ inputs.restateCommit != '' && github.event_name != 'workflow_dispatch' }}
uses: actions/download-artifact@v4
with:
name: restate.tar
# In the workflow dispatch case where the artifact was created in a previous run, we can download as normal
- name: Download restate snapshot from completed workflow
if: ${{ inputs.restateCommit != '' && github.event_name == 'workflow_dispatch' }}
uses: dawidd6/action-download-artifact@v3
with:
repo: restatedev/restate
workflow: ci.yml
commit: ${{ inputs.restateCommit }}
name: restate.tar
- name: Install restate snapshot
if: ${{ inputs.restateCommit != '' }}
run: |
output=$(docker load --input restate.tar)
docker tag "${output#*: }" "localhost/restatedev/restate-commit-download:latest"
docker image ls -a
- name: Setup Java
uses: actions/setup-java@v4
with:
distribution: "temurin"
java-version: "17"
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Setup sdk-test-suite
run: wget --no-verbose https://github.com/restatedev/sdk-test-suite/releases/download/v${{ matrix.sdk-test-suite }}/restate-sdk-test-suite.jar

- name: Build Typescript test-services image
id: build
uses: docker/build-push-action@v6
with:
context: .
file: "packages/restate-e2e-services/Dockerfile"
push: false
load: true
tags: localhost/restatedev/test-services:latest
cache-from: type=gha,scope=${{ github.workflow }}
cache-to: type=gha,mode=max,scope=${{ github.workflow }}

# Run test suite
- name: Run test suite
env:
RESTATE_CONTAINER_IMAGE: ${{ inputs.restateCommit != '' && 'localhost/restatedev/restate-commit-download:latest' || (inputs.restateImage != '' && inputs.restateImage || 'ghcr.io/restatedev/restate:main') }}
run: java -jar restate-sdk-test-suite.jar run --report-dir=test-report --exclusions-file packages/restate-e2e-services/exclusions.yaml localhost/restatedev/test-services:latest

# Upload logs and publish test result
- uses: actions/upload-artifact@v4
if: always() # Make sure this is run even when test fails
with:
name: sdk-typescript-integration-test-report
path: test-report
- name: Publish Test Results
uses: EnricoMi/publish-unit-test-result-action@v2
if: always()
with:
files: |
test-report/*/*.xml
1 change: 1 addition & 0 deletions packages/restate-e2e-services/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ COPY . .

RUN npm install

RUN npm run proto
RUN npm run build

FROM node:20 as prod

Check warning on line 12 in packages/restate-e2e-services/Dockerfile

View workflow job for this annotation

GitHub Actions / Features integration test (sdk-test-suite version 1.5)

The 'as' keyword should match the case of the 'from' keyword

FromAsCasing: 'as' and 'FROM' keywords' casing do not match More info: https://docs.docker.com/go/dockerfile/rule/from-as-casing/
Expand Down
1 change: 1 addition & 0 deletions packages/restate-e2e-services/exclusions.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
exclusions: {}
1 change: 1 addition & 0 deletions packages/restate-e2e-services/src/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import "./side_effect.js";
import "./workflow.js";
import "./proxy.js";
import "./test_utils.js";
import "./kill.js";

import { REGISTRY } from "./services.js";

Expand Down
43 changes: 43 additions & 0 deletions packages/restate-e2e-services/src/kill.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
// Copyright (c) 2023 - Restate Software, Inc., Restate GmbH
//
// This file is part of the Restate e2e tests,
// which are released under the MIT license.
//
// You can find a copy of the license in file LICENSE in the root
// directory of this repository or package, or at
// https://github.com/restatedev/e2e/blob/main/LICENSE

import * as restate from "@restatedev/restate-sdk";
import { REGISTRY } from "./services.js";
import type { AwakeableHolder } from "./awakeable_holder.js";

const kill = restate.service({
name: "KillTestRunner",
handlers: {
async startCallTree(ctx: restate.ObjectContext) {
await ctx.objectClient(killSingleton, "").recursiveCall();
},
},
});

const killSingleton = restate.object({
name: "KillTestSingleton",
handlers: {
async recursiveCall(ctx: restate.ObjectContext) {
const { id, promise } = ctx.awakeable();
ctx
.objectSendClient<AwakeableHolder>({ name: "AwakeableHolder" }, "kill")
.hold(id);
await promise;

await ctx.objectClient(killSingleton, "").recursiveCall();
},

isUnlocked() {
return Promise.resolve();
},
},
});

REGISTRY.addService(kill);
REGISTRY.addObject(killSingleton);

0 comments on commit 8b008ea

Please sign in to comment.