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

add browser tck test suite #212

Open
wants to merge 10 commits into
base: 1.0.x
Choose a base branch
from
37 changes: 37 additions & 0 deletions .github/workflows/build.yml
Expand Up @@ -66,6 +66,43 @@ jobs:
- name: Test
run: yarn test

browser-tck:
runs-on: ubuntu-latest
container: lironavon/docker-puppeteer-container:14.16.0

steps:
- name: Checkout
uses: actions/checkout@v2

- name: Install Node
uses: actions/setup-node@v2
with:
node-version: 12

- name: Install Yarn
run: npm install -g yarn

- name: Cache dependencies
uses: actions/cache@v2
with:
path: ~/.yarn
key: ${{ runner.OS }}-node-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.OS }}-node-
${{ runner.OS }}-

- name: Install dependencies
run: yarn --frozen-lockfile

- name: Bootstrap
run: yarn bootstrap

- name: Build packages
run: yarn build -- --ignore=@rsocket/browser-tck

- name: Test
run: yarn ci-test-rsocket-browser-tck

compile:
runs-on: ubuntu-latest

Expand Down
25 changes: 20 additions & 5 deletions package.json
Expand Up @@ -2,20 +2,35 @@
"name": "rsocket-js",
"description": "A JavaScript implementation of the RSocket protocol (https://github.com/rsocket/rsocket).",
"private": true,
"workspaces": [
"packages/*"
],
"workspaces": {
"packages": [
"packages/*"
],
"nohoist": [
"**/karma-*",
"**/karma-*/**",
"**/expect.js",
"**/expect.js/**",
"**/@types/jest",
"**/@types/jest/**",
"**/@types/mocha",
"**/@types/mocha/**"
]
},
"scripts": {
"bootstrap": "lerna bootstrap",
"build": "lerna run build",
"clean": "lerna run clean && rimraf -rf ./coverage",
"pub": "lerna publish",
"pretest": "yarn clean",
"test": "lerna run test",
"test": "lerna run test --ignore=@rsocket/browser-tck",
"pretest-rsocket-browser-tck": "lerna bootstrap && lerna run build --ignore=@rsocket/browser-tck",
"test-rsocket-browser-tck": "lerna run test --scope=@rsocket/browser-tck",
"ci-test-rsocket-browser-tck": "lerna run test --scope=@rsocket/browser-tck",
"lint": "eslint --ext js,ts .",
"lint:fix": "npm run lint -- --fix"
},
"devDependencies": {
"@types/jest": "^27.0.3",
"@types/node": "^17.0.5",
"eslint": "~8.5.0",
"eslint-plugin-import": "~2.25.3",
Expand Down
23 changes: 23 additions & 0 deletions packages/rsocket-browser-tck/README.md
@@ -0,0 +1,23 @@
# Runnable example of unit testing Typescript on the fly in Karma with Istanbul coverage and Mocha

## Installation

```
git clone https://github.com/monounity/karma-typescript.git
cd karma-typescript/examples/mocha
npm install
```

## Running

```
npm test
```

The example unit tests should now run in Karma and html test coverage should be created in the folder `coverage` in the project root.

## Licensing

This software is licensed with the MIT license.

© 2016-2021 Erik Barke, Monounity
71 changes: 71 additions & 0 deletions packages/rsocket-browser-tck/browser-tck.js
@@ -0,0 +1,71 @@
const path = require("path");
const karma = require("karma");
const { RSocketServer } = require("@rsocket/core");
const {
WebsocketServerTransport,
} = require("@rsocket/transport-websocket-server");
const WebSocket = require("ws");
const parseConfig = karma.config.parseConfig;
const Server = karma.Server;

const rsocketServerPort = 9091;
const rSocketServer = new RSocketServer({
transport: new WebsocketServerTransport({
wsCreator: (options) => {
return new WebSocket.Server({
port: rsocketServerPort,
});
},
}),
acceptor: {
accept: async () => ({
requestResponse: (payload, responderStream) => {
const timeout = setTimeout(
() =>
responderStream.onNext(
{
data: Buffer.concat([Buffer.from("Echo: "), payload.data]),
},
true
),
80
);
return {
cancel: () => {
clearTimeout(timeout);
console.log("cancelled");
},
onExtension: () => {
console.log("Received Extension request");
},
};
},
}),
},
});

let karmaServer = null;
let karmaConfig = null;
let rSocketServerClosable = null;
parseConfig(
path.resolve("./karma.conf.js"),
{ port: 9876 },
{ promiseConfig: true, throwErrors: true }
)
.then(async (_karmaConfig) => {
rSocketServerClosable = await rSocketServer.bind();
console.log(`RSocket Server started on port ${rsocketServerPort}`);
karmaConfig = _karmaConfig;
karmaServer = new Server(_karmaConfig, async function doneCallback(
exitCode
) {
console.log(`Karma exited with code: ${exitCode}`);
await rSocketServerClosable.close();
process.exit(exitCode);
});
return karmaServer.start();
})
.catch((rejectReason) => {
console.error(rejectReason);
process.exit(1);
});
35 changes: 35 additions & 0 deletions packages/rsocket-browser-tck/karma.conf.js
@@ -0,0 +1,35 @@
process.env.CHROME_BIN = require("puppeteer").executablePath();

module.exports = function (config) {
config.set({
frameworks: ["mocha", "karma-typescript"],

files: [
{ pattern: "node_modules/expect.js/index.js" },
{ pattern: "src/**/*.ts" },
],

preprocessors: {
"**/*.ts": ["karma-typescript"],
},

reporters: ["mocha", "karma-typescript"],

browsers: ["ChromeHeadlessCI"],

singleRun: process.env.WATCH !== true,

customLaunchers: {
ChromeHeadlessCI: {
base: "ChromeHeadless",
flags: ["--no-sandbox"],
},
},

karmaTypescriptConfig: {
bundlerOptions: {
addNodeGlobals: false,
},
},
});
};