Skip to content

Commit 65a6c61

Browse files
committed
Complete protobuf refactor
1 parent 7232683 commit 65a6c61

17 files changed

Lines changed: 3414 additions & 402 deletions

File tree

‎justfile‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
set default-list := true
2+
3+
lint:
4+
npx eslint src/**/* --config .eslint.config.mjs
5+
6+
format:
7+
npx eslint src/**/* --config .eslint.config.mjs --fix
8+
9+
protocol:
10+
temp_dir=$(mktemp -d) && trap 'rm -rf "$temp_dir"' EXIT && curl --fail --silent --show-error --location https://raw.githubusercontent.com/TOPLLab/WARDuino/7805f0bc87e79c55c151788a279f2ecb13e0fa7a/src/Debug/debug.proto --output "$temp_dir/debug.proto" && protoc --proto_path="$temp_dir" --plugin=protoc-gen-ts_proto=node_modules/.bin/protoc-gen-ts_proto --ts_proto_out=src/protocol/vendor --ts_proto_opt=env=node,forceLong=bigint,useOptionals=messages,outputEncodeMethods=true,outputJsonMethods=false "$temp_dir/debug.proto"
11+
12+
test:
13+
npm run test:all

‎package-lock.json‎

Lines changed: 80 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎package.json‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "latch",
33
"description": "A testing framework for constrained environments",
4-
"version": "0.6.0",
4+
"version": "0.7.0",
55
"repository": {
66
"type": "git",
77
"url": "https://github.com/TOPLLab/latch.git"
@@ -40,6 +40,7 @@
4040
"test:prebuild": "npm run build && npm run build:tests",
4141
"test": "npm run test:all",
4242
"test:all": "npm run test:prebuild && npm run test:ava && npm run test:integration && npm run test:end-to-end",
43+
"protocol:generate": "just protocol",
4344
"test:ava": "ava",
4445
"test:integration": "npx ts-node ./tests/integration/precision.ts",
4546
"test:end-to-end": "npx ts-node ./tests/end-to-end/end2end.test.ts",

‎src/framework/Testee.ts‎

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -319,15 +319,19 @@ export class Testee { // TODO unified with testbed interface
319319
recover: (t: Testee) => Promise<any>,
320320
retries: number = 0): Promise<object | void> {
321321
let result: object | void = undefined;
322-
let error;
323-
while (0 <= retries && result === undefined) {
324-
result = await attempt(testee, step, map).catch(async (err) => {
322+
let error: unknown;
323+
let succeeded = false;
324+
while (0 <= retries && !succeeded) {
325+
try {
326+
result = await attempt(testee, step, map);
327+
succeeded = true;
328+
} catch (err) {
325329
error = err;
326330
await recover(testee);
327-
});
328-
retries--;
331+
retries--;
332+
}
329333
}
330-
return (result === undefined) ? Promise.reject(error) : result;
334+
return succeeded ? result! : Promise.reject(error);
331335
}
332336

333337
public skipall(): Testee {

‎src/framework/scenario/Actions.ts‎

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ import {setTimeout} from 'timers/promises';
33
import {Testee} from '../Testee';
44
import {TestbedEvents} from '../../testbeds/Testbed';
55
import {Breakpoint} from '../../debug/Breakpoint';
6-
import {breakpointHitParser} from '../../messaging/Parsers';
6+
import {DebugFrame} from '../../protocol/frame';
7+
import {HitBreakpoint, NotificationType} from '../../protocol/vendor/debug';
78

89
export interface Dictionary {
910
[index: string]: any;
@@ -32,16 +33,12 @@ export function awaitBreakpoint(): Action<Breakpoint> {
3233
return {
3334
act: (testee: Testee) => {
3435
return new Promise<Assertable<Breakpoint>>((resolve) => {
35-
function breakpointListener(message: string) {
36-
// check breakpoint hit message
37-
try {
38-
const breakpoint = breakpointHitParser(message);
39-
// on success: remove listener + resolve
40-
testee.bed()?.removeListener(TestbedEvents.OnMessage, breakpointListener);
41-
resolve(assertable(breakpoint));
42-
} catch {
43-
// breakpoint not hit yet
44-
}
36+
function breakpointListener(frame: DebugFrame) {
37+
if (frame.type !== NotificationType.NOTIFICATION_HIT_BREAKPOINT) return;
38+
const location = HitBreakpoint.decode(frame.payload).location;
39+
if (location === undefined) return;
40+
testee.bed()?.removeListener(TestbedEvents.OnMessage, breakpointListener);
41+
resolve(assertable(new Breakpoint(location.programCounter, 0)));
4542
}
4643

4744
// await breakpoint hit

‎src/index.ts‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,7 @@ export * from './testbeds/TestbedSpecification';
1616
export * from './debug/Breakpoint';
1717
export * from './reporter/index';
1818
export * from './debug/WARDuino';
19+
export * from './protocol/frame';
20+
export * as DebugProtocol from './protocol/vendor/debug';
1921

2022
export const latch = Framework.getImplementation();

0 commit comments

Comments
 (0)