Compare commits
21 Commits
0bea41f866
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 2d5ca20ae4 | |||
| f2042d624b | |||
| f8c79131c9 | |||
| 28d149f536 | |||
| 9a39cf923a | |||
| 07b6b4898a | |||
| 03c7a95e9b | |||
| 45dcb9a71f | |||
| 4286ea4539 | |||
| 8337d678be | |||
| b65ac06ce2 | |||
| 83d0a060fe | |||
| efb4ea48fb | |||
| f0f83110a4 | |||
| 269b2c4d97 | |||
| 1d78b45963 | |||
| ef58553c63 | |||
| 69e52af20b | |||
| 1fcc4e4e6d | |||
| 462b05b71a | |||
| dcaa466736 |
@@ -89,7 +89,7 @@ clangd. The CMake-based clients (ImGui, Qt) also export it into their `build/`.
|
|||||||
cd Common/Client/go && go build ./...
|
cd Common/Client/go && go build ./...
|
||||||
cd Client/debugger && go build ./...
|
cd Client/debugger && go build ./...
|
||||||
cd Client/udpstreamer && go build ./... # or: cd Client/webui && go build
|
cd Client/udpstreamer && go build ./... # or: cd Client/webui && go build
|
||||||
cd Test/E2E/chain/client && go build ./... # chain-client (E2E driver) + its tests
|
cd Test/E2E/suite/client && go build ./... # chain-client (E2E driver) + its tests
|
||||||
|
|
||||||
# ImGui desktop client (needs SDL2; fetches Dear ImGui + ImPlot via FetchContent)
|
# ImGui desktop client (needs SDL2; fetches Dear ImGui + ImPlot via FetchContent)
|
||||||
cd Client/streamhub && cmake -B build -DCMAKE_BUILD_TYPE=Release && cmake --build build
|
cd Client/streamhub && cmake -B build -DCMAKE_BUILD_TYPE=Release && cmake --build build
|
||||||
@@ -113,13 +113,13 @@ cd Client/streamhub-qt && cmake -B build && cmake --build build
|
|||||||
### Go tests
|
### Go tests
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd Test/E2E/chain/client && go test ./...
|
cd Test/E2E/suite/client && go test ./...
|
||||||
```
|
```
|
||||||
|
|
||||||
### Python framework tests (E2E framework logic, no live stack needed)
|
### Python framework tests (E2E framework logic, no live stack needed)
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd Test/E2E/chain && python3 -m unittest tests_py
|
cd Test/E2E/suite && python3 -m unittest tests_py
|
||||||
```
|
```
|
||||||
|
|
||||||
### E2E / demo scripts (build + launch the full stack)
|
### E2E / demo scripts (build + launch the full stack)
|
||||||
@@ -127,10 +127,8 @@ cd Test/E2E/chain && python3 -m unittest tests_py
|
|||||||
| Script | What it does |
|
| Script | What it does |
|
||||||
|---|---|
|
|---|---|
|
||||||
| `./run_streamhub.sh` | Launch MARTe2 app (UDPStreamer) + StreamHub, optionally web UI (`-w`) and ImGui client (`-g`). Ports documented in its header. |
|
| `./run_streamhub.sh` | Launch MARTe2 app (UDPStreamer) + StreamHub, optionally web UI (`-w`) and ImGui client (`-g`). Ports documented in its header. |
|
||||||
| `./run_combined_test.sh` | Combined streaming + debug integration test. `-d` auto-starts the debugger web UI. |
|
| `./Test/E2E/suite/run_e2e.sh` | **Unified E2E suite**: per-scenario generates data + cfgs, runs MARTe2+StreamHub, drives the Go `chain-client` (live/zoom/window/trigger) for `chain` scenarios plus `direct`/`recorder`/`debug`/`tcplogger` scenario kinds, runs a stress matrix, unit suites + coverage, builds a Typst PDF report. Flags: `--skip-build`, `--only <id>`, `--pdf-only`, `--cpp-coverage`, `--skip-coverage`, `--skip-stress`, `--skip-datasources`, `--skip-recorder`, `--skip-debug`, `--skip-tcplogger`. |
|
||||||
| `./run_e2e_test.sh` | Older standalone StreamHub E2E (`-s` skips build). |
|
| `./Test/E2E/suite/run_stress.sh` | **Capacity/stress harness**: sweeps one load axis at a time (signal size/count, subscriber fan-out, source count, WS-client count, zoom rate), gates on survival+liveness (hard) and RSS+zoom-p95 latency (soft). Flags: `--skip-build`, `--only <id>`, `--axis <axis>`. |
|
||||||
| `./Test/E2E/chain/run_chain_e2e.sh` | **Streaming-chain E2E suite**: per-scenario generates data + cfgs, runs MARTe2+StreamHub, drives the Go `chain-client` (live/zoom/window/trigger), validates the recorded waveform against an analytic/fed oracle, runs unit suites + coverage, builds a Typst PDF report. Flags: `--skip-build`, `--only <id>`, `--cpp-coverage`, `--pdf-only`, `--stress`. |
|
|
||||||
| `./Test/E2E/chain/run_stress.sh` | **Capacity/stress harness**: sweeps one load axis at a time (signal size/count, subscriber fan-out, source count, WS-client count, zoom rate), gates on survival+liveness (hard) and RSS+zoom-p95 latency (soft). Flags: `--skip-build`, `--only <id>`, `--axis <axis>`. |
|
|
||||||
|
|
||||||
The E2E suite produces `Build/x86-linux/E2E/chain/` artifacts: `report_data.json`,
|
The E2E suite produces `Build/x86-linux/E2E/chain/` artifacts: `report_data.json`,
|
||||||
`history.jsonl` (per-run headline metrics for trend/regression tracking),
|
`history.jsonl` (per-run headline metrics for trend/regression tracking),
|
||||||
@@ -246,7 +244,7 @@ default 1, `Decimation` default 1, `FlushIntervalSec` default 5,
|
|||||||
|
|
||||||
### E2E scenario / stress matrix
|
### E2E scenario / stress matrix
|
||||||
|
|
||||||
`Test/E2E/chain/scenarios.py` is a *curated covering set*: every configurable
|
`Test/E2E/suite/scenarios.py` is a *curated covering set*: every configurable
|
||||||
UDPStreamer option value appears in at least one scenario, plus high-risk
|
UDPStreamer option value appears in at least one scenario, plus high-risk
|
||||||
interactions. `stress.py` is the capacity sibling — it sweeps one load axis at
|
interactions. `stress.py` is the capacity sibling — it sweeps one load axis at
|
||||||
a time and records survival/liveness (hard gates) and RSS/zoom-p95 latency
|
a time and records survival/liveness (hard gates) and RSS/zoom-p95 latency
|
||||||
|
|||||||
@@ -37,9 +37,9 @@ cd Client/streamhub && cmake -B build -DCMAKE_BUILD_TYPE=Release && cmake --buil
|
|||||||
cd Client/streamhub-qt && cmake -B build && cmake --build build
|
cd Client/streamhub-qt && cmake -B build && cmake --build build
|
||||||
```
|
```
|
||||||
|
|
||||||
End-to-end demo scripts (build + launch full stack, see headers for ports/options): `./run_combined_test.sh`, `./run_streamhub.sh`.
|
End-to-end demo script (build + launch full stack, see header for ports/options): `./run_streamhub.sh`.
|
||||||
|
|
||||||
**Streaming-chain E2E suite** (`Test/E2E/chain/`): `./run_chain_e2e.sh [--skip-build] [--only <id>] [--cpp-coverage]` drives the full chain per scenario (`scenarios.py`) — generates typed/shaped input + both cfgs, runs MARTe2+StreamHub, records via the Go `chain-client` (live/zoom/window/trigger), and validates the recorded waveform against an analytic/fed oracle (`validate_waveform.py`: fidelity gates correctness, sine shape-fit is a gross-sanity gate + tracked metric pending Phase-A timestamp calibration). It then runs the unit suites + coverage (`collect.py`: C++ GTest, Go, Python; `--cpp-coverage` does an instrumented `--coverage` rebuild, captures with lcov restricted to `Source/*`+`Test/*`, then restores the clean build), consolidates everything into `report_data.json` with per-field progression/regression vs the previous run and trend plots (`report_build.py`, history in `Build/x86-linux/E2E/chain/history.jsonl`), and compiles a Typst PDF (`E2E_Report.typ`). Python framework unit tests: `python3 -m unittest tests_py` (in `Test/E2E/chain/`).
|
**Streaming-chain E2E suite** (`Test/E2E/suite/`): `./run_e2e.sh [--skip-build] [--only <id>] [--cpp-coverage]` drives the full chain per scenario (`scenarios.py`) — generates typed/shaped input + both cfgs, runs MARTe2+StreamHub, records via the Go `chain-client` (live/zoom/window/trigger), and validates the recorded waveform against an analytic/fed oracle (`validate_waveform.py`: fidelity gates correctness, sine shape-fit is a gross-sanity gate + tracked metric pending Phase-A timestamp calibration). It then runs the unit suites + coverage (`collect.py`: C++ GTest, Go, Python; `--cpp-coverage` does an instrumented `--coverage` rebuild, captures with lcov restricted to `Source/*` (the `Test/` harness itself is excluded — it executes every line by construction and would just inflate the number), then restores the clean build), consolidates everything into `report_data.json` with per-field progression/regression vs the previous run and trend plots (`report_build.py`, history in `Build/x86-linux/E2E/chain/history.jsonl`), and compiles a Typst PDF (`E2E_Report.typ`). Python framework unit tests: `python3 -m unittest tests_py` (in `Test/E2E/suite/`).
|
||||||
|
|
||||||
Build output goes to `Build/x86-linux/` (shared libs per component, `.ex` executables).
|
Build output goes to `Build/x86-linux/` (shared libs per component, `.ex` executables).
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package main
|
package controller
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
@@ -1,4 +1,9 @@
|
|||||||
package main
|
// Package controller implements MarteController, the shared TCP/UDP client
|
||||||
|
// logic that drives a running MARTe2 DebugService+TCPLogger instance. It is
|
||||||
|
// consumed both by the Client/debugger browser-facing WebSocket server
|
||||||
|
// (package main, via NewMarteController) and headlessly by the
|
||||||
|
// Test/E2E/suite/debugclient E2E test tool (via NewHeadlessMarteController).
|
||||||
|
package controller
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
@@ -21,9 +26,9 @@ import (
|
|||||||
// Command safety gate (CR-4)
|
// Command safety gate (CR-4)
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
// dangerousCommandsEnabled gates commands that mutate the RT application state
|
// DangerousCommandsEnabled gates commands that mutate the RT application state
|
||||||
// (FORCE, PAUSE, RESUME, STEP, BREAK, MSG). Set via --enable-dangerous-commands.
|
// (FORCE, PAUSE, RESUME, STEP, BREAK, MSG). Set via --enable-dangerous-commands.
|
||||||
var dangerousCommandsEnabled = false
|
var DangerousCommandsEnabled = false
|
||||||
|
|
||||||
// dangerousCommands is the set of MARTe2 commands that can change signal values
|
// dangerousCommands is the set of MARTe2 commands that can change signal values
|
||||||
// or alter execution flow. Without --enable-dangerous-commands these are blocked
|
// or alter execution flow. Without --enable-dangerous-commands these are blocked
|
||||||
@@ -81,7 +86,8 @@ func broadcastHub(hub *wshub.Hub, v any) {
|
|||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
type MarteController struct {
|
type MarteController struct {
|
||||||
hub *wshub.Hub
|
hub *wshub.Hub
|
||||||
|
sink func(v any)
|
||||||
|
|
||||||
mu sync.Mutex
|
mu sync.Mutex
|
||||||
tcpConn net.Conn
|
tcpConn net.Conn
|
||||||
@@ -135,6 +141,7 @@ func NewMarteController(hub *wshub.Hub) *MarteController {
|
|||||||
forcedState: make(map[string]string),
|
forcedState: make(map[string]string),
|
||||||
stopCh: make(chan struct{}),
|
stopCh: make(chan struct{}),
|
||||||
}
|
}
|
||||||
|
mc.sink = func(v any) { broadcastHub(mc.hub, v) }
|
||||||
// Register the new-client hook so connection + forced/traced state is
|
// Register the new-client hook so connection + forced/traced state is
|
||||||
// replayed to any browser that connects (or reconnects) while the server
|
// replayed to any browser that connects (or reconnects) while the server
|
||||||
// already holds a live MARTe2 TCP session.
|
// already holds a live MARTe2 TCP session.
|
||||||
@@ -142,6 +149,20 @@ func NewMarteController(hub *wshub.Hub) *MarteController {
|
|||||||
return mc
|
return mc
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewHeadlessMarteController creates a MarteController with no WebSocket hub,
|
||||||
|
// routing all events through sink instead (used by the debugclient E2E test tool).
|
||||||
|
func NewHeadlessMarteController(sink func(v any)) *MarteController {
|
||||||
|
mc := &MarteController{
|
||||||
|
hub: nil,
|
||||||
|
signals: make(map[uint32]*SignalMeta),
|
||||||
|
tracedNames: make(map[string]bool),
|
||||||
|
forcedState: make(map[string]string),
|
||||||
|
stopCh: make(chan struct{}),
|
||||||
|
}
|
||||||
|
mc.sink = sink
|
||||||
|
return mc
|
||||||
|
}
|
||||||
|
|
||||||
func (m *MarteController) IsConnected() bool {
|
func (m *MarteController) IsConnected() bool {
|
||||||
return atomic.LoadInt32(&m.connected) == 1
|
return atomic.LoadInt32(&m.connected) == 1
|
||||||
}
|
}
|
||||||
@@ -200,10 +221,13 @@ func (m *MarteController) Connect(host string, cmdPort, udpPort, logPort int) {
|
|||||||
m.stopCh = make(chan struct{})
|
m.stopCh = make(chan struct{})
|
||||||
m.mu.Unlock()
|
m.mu.Unlock()
|
||||||
|
|
||||||
// Update source state so the browser shows "connecting".
|
// Update source state so the browser shows "connecting". No-op headless
|
||||||
m.hub.SetSourceState("debug", "connecting")
|
// (m.hub == nil for NewHeadlessMarteController instances).
|
||||||
|
if m.hub != nil {
|
||||||
|
m.hub.SetSourceState("debug", "connecting")
|
||||||
|
}
|
||||||
|
|
||||||
broadcastHub(m.hub, map[string]any{
|
m.sink(map[string]any{
|
||||||
"type": "log", "time": time.Now().Format("15:04:05.000"),
|
"type": "log", "time": time.Now().Format("15:04:05.000"),
|
||||||
"level": "INFO", "message": fmt.Sprintf("Connecting to %s cmd=%d udp=%d log=%d", host, cmdPort, udpPort, logPort),
|
"level": "INFO", "message": fmt.Sprintf("Connecting to %s cmd=%d udp=%d log=%d", host, cmdPort, udpPort, logPort),
|
||||||
})
|
})
|
||||||
@@ -232,7 +256,9 @@ func (m *MarteController) Disconnect() {
|
|||||||
m.baseTsSet = false
|
m.baseTsSet = false
|
||||||
m.basesMu.Unlock()
|
m.basesMu.Unlock()
|
||||||
m.discoverAcc = nil
|
m.discoverAcc = nil
|
||||||
m.hub.SetSourceState("debug", "disconnected")
|
if m.hub != nil {
|
||||||
|
m.hub.SetSourceState("debug", "disconnected")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *MarteController) stopped() bool {
|
func (m *MarteController) stopped() bool {
|
||||||
@@ -298,8 +324,8 @@ func (m *MarteController) HandleBrowserCommand(msg []byte) {
|
|||||||
// (DISCOVER, TREE, INFO, LS, VALUE, TRACE, UNTRACE, STEP_STATUS) are
|
// (DISCOVER, TREE, INFO, LS, VALUE, TRACE, UNTRACE, STEP_STATUS) are
|
||||||
// forwarded to the MARTe2 TCP control connection.
|
// forwarded to the MARTe2 TCP control connection.
|
||||||
if isDangerousCommand(cmd) {
|
if isDangerousCommand(cmd) {
|
||||||
if !dangerousCommandsEnabled {
|
if !DangerousCommandsEnabled {
|
||||||
broadcastHub(m.hub, map[string]any{
|
m.sink(map[string]any{
|
||||||
"type": "log", "time": time.Now().Format("15:04:05.000"),
|
"type": "log", "time": time.Now().Format("15:04:05.000"),
|
||||||
"level": "WARNING",
|
"level": "WARNING",
|
||||||
"message": fmt.Sprintf("Blocked dangerous command (requires --enable-dangerous-commands): %s", cmd),
|
"message": fmt.Sprintf("Blocked dangerous command (requires --enable-dangerous-commands): %s", cmd),
|
||||||
@@ -321,7 +347,7 @@ func (m *MarteController) runTCP(host string, port int) {
|
|||||||
for !m.stopped() {
|
for !m.stopped() {
|
||||||
conn, err := net.DialTimeout("tcp", addr, 5*time.Second)
|
conn, err := net.DialTimeout("tcp", addr, 5*time.Second)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
broadcastHub(m.hub, map[string]any{
|
m.sink(map[string]any{
|
||||||
"type": "log", "time": time.Now().Format("15:04:05.000"),
|
"type": "log", "time": time.Now().Format("15:04:05.000"),
|
||||||
"level": "WARNING", "message": fmt.Sprintf("TCP %s: %v — retrying…", addr, err),
|
"level": "WARNING", "message": fmt.Sprintf("TCP %s: %v — retrying…", addr, err),
|
||||||
})
|
})
|
||||||
@@ -336,7 +362,7 @@ func (m *MarteController) runTCP(host string, port int) {
|
|||||||
m.mu.Unlock()
|
m.mu.Unlock()
|
||||||
|
|
||||||
atomic.StoreInt32(&m.connected, 1)
|
atomic.StoreInt32(&m.connected, 1)
|
||||||
broadcastHub(m.hub, map[string]any{"type": "connected"})
|
m.sink(map[string]any{"type": "connected"})
|
||||||
|
|
||||||
// Send SERVICE_INFO to auto-discover ports
|
// Send SERVICE_INFO to auto-discover ports
|
||||||
m.writeCmd("SERVICE_INFO")
|
m.writeCmd("SERVICE_INFO")
|
||||||
@@ -346,7 +372,7 @@ func (m *MarteController) runTCP(host string, port int) {
|
|||||||
m.readLoop(conn)
|
m.readLoop(conn)
|
||||||
|
|
||||||
atomic.StoreInt32(&m.connected, 0)
|
atomic.StoreInt32(&m.connected, 0)
|
||||||
broadcastHub(m.hub, map[string]any{"type": "disconnected"})
|
m.sink(map[string]any{"type": "disconnected"})
|
||||||
|
|
||||||
m.mu.Lock()
|
m.mu.Lock()
|
||||||
m.tcpConn = nil
|
m.tcpConn = nil
|
||||||
@@ -372,7 +398,7 @@ func (m *MarteController) writeCmd(cmd string) {
|
|||||||
silent := cmd == "STEP_STATUS" || cmd == "INFO"
|
silent := cmd == "STEP_STATUS" || cmd == "INFO"
|
||||||
if !silent {
|
if !silent {
|
||||||
log.Printf("[→MARTe] %s", cmd)
|
log.Printf("[→MARTe] %s", cmd)
|
||||||
broadcastHub(m.hub, map[string]any{
|
m.sink(map[string]any{
|
||||||
"type": "log", "time": time.Now().Format("15:04:05.000"),
|
"type": "log", "time": time.Now().Format("15:04:05.000"),
|
||||||
"level": "CMD", "message": fmt.Sprintf("→ %s", cmd),
|
"level": "CMD", "message": fmt.Sprintf("→ %s", cmd),
|
||||||
})
|
})
|
||||||
@@ -514,7 +540,7 @@ func (m *MarteController) handleJSONResponse(tag, data string) {
|
|||||||
silent := tag == "STEP_STATUS" || tag == "INFO"
|
silent := tag == "STEP_STATUS" || tag == "INFO"
|
||||||
if !silent {
|
if !silent {
|
||||||
log.Printf("[←MARTe] %s %d bytes", tag, len(data))
|
log.Printf("[←MARTe] %s %d bytes", tag, len(data))
|
||||||
broadcastHub(m.hub, map[string]any{
|
m.sink(map[string]any{
|
||||||
"type": "log", "time": time.Now().Format("15:04:05.000"),
|
"type": "log", "time": time.Now().Format("15:04:05.000"),
|
||||||
"level": "RESP", "message": fmt.Sprintf("← %s (%d B)", tag, len(data)),
|
"level": "RESP", "message": fmt.Sprintf("← %s (%d B)", tag, len(data)),
|
||||||
})
|
})
|
||||||
@@ -549,25 +575,27 @@ func (m *MarteController) handleJSONResponse(tag, data string) {
|
|||||||
raw := m.rawSigs
|
raw := m.rawSigs
|
||||||
m.rawSigsMu.RUnlock()
|
m.rawSigsMu.RUnlock()
|
||||||
if len(raw) > 0 {
|
if len(raw) > 0 {
|
||||||
m.hub.UpdateConfigForSource("debug", m.translateSignalNames(raw))
|
if m.hub != nil {
|
||||||
|
m.hub.UpdateConfigForSource("debug", m.translateSignalNames(raw))
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
m.synthesizeHubConfig(all)
|
m.synthesizeHubConfig(all)
|
||||||
}
|
}
|
||||||
// Re-marshal the merged list so the browser gets a single consistent blob.
|
// Re-marshal the merged list so the browser gets a single consistent blob.
|
||||||
merged, _ := json.Marshal(discoverResp{Signals: all})
|
merged, _ := json.Marshal(discoverResp{Signals: all})
|
||||||
broadcastHub(m.hub, map[string]any{
|
m.sink(map[string]any{
|
||||||
"type": "response", "tag": "DISCOVER", "data": string(merged),
|
"type": "response", "tag": "DISCOVER", "data": string(merged),
|
||||||
})
|
})
|
||||||
return
|
return
|
||||||
|
|
||||||
case "TREE":
|
case "TREE":
|
||||||
broadcastHub(m.hub, map[string]any{
|
m.sink(map[string]any{
|
||||||
"type": "tree_node",
|
"type": "tree_node",
|
||||||
"data": data,
|
"data": data,
|
||||||
})
|
})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
broadcastHub(m.hub, map[string]any{
|
m.sink(map[string]any{
|
||||||
"type": "response",
|
"type": "response",
|
||||||
"tag": tag,
|
"tag": tag,
|
||||||
"data": data,
|
"data": data,
|
||||||
@@ -586,13 +614,13 @@ func (m *MarteController) handleTextLine(line string) {
|
|||||||
fmt.Sscanf(p[8:], "%d", &newLog)
|
fmt.Sscanf(p[8:], "%d", &newLog)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
broadcastHub(m.hub, map[string]any{
|
m.sink(map[string]any{
|
||||||
"type": "response",
|
"type": "response",
|
||||||
"tag": "SERVICE_INFO",
|
"tag": "SERVICE_INFO",
|
||||||
"data": line[len("OK SERVICE_INFO "):],
|
"data": line[len("OK SERVICE_INFO "):],
|
||||||
})
|
})
|
||||||
if newUDP > 0 || newLog > 0 {
|
if newUDP > 0 || newLog > 0 {
|
||||||
broadcastHub(m.hub, map[string]any{
|
m.sink(map[string]any{
|
||||||
"type": "service_config",
|
"type": "service_config",
|
||||||
"udp_port": newUDP,
|
"udp_port": newUDP,
|
||||||
"log_port": newLog,
|
"log_port": newLog,
|
||||||
@@ -616,7 +644,7 @@ func (m *MarteController) handleTextLine(line string) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
broadcastHub(m.hub, map[string]any{
|
m.sink(map[string]any{
|
||||||
"type": "text_line",
|
"type": "text_line",
|
||||||
"data": line,
|
"data": line,
|
||||||
})
|
})
|
||||||
@@ -823,7 +851,9 @@ func (m *MarteController) synthesizeHubConfig(sigs []discoverSignalJSON) {
|
|||||||
// buffer and limiting live streaming to the fraction of a second that
|
// buffer and limiting live streaming to the fraction of a second that
|
||||||
// accumulated before the DISCOVER response arrived.
|
// accumulated before the DISCOVER response arrived.
|
||||||
translated := m.translateSignalNames(sigInfos)
|
translated := m.translateSignalNames(sigInfos)
|
||||||
m.hub.UpdateConfigForSource("debug", translated)
|
if m.hub != nil {
|
||||||
|
m.hub.UpdateConfigForSource("debug", translated)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
@@ -850,7 +880,7 @@ func (m *MarteController) runDebugUDP(host string, port int) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
msg := fmt.Sprintf("UDP bind on %s failed: %v — rebuild DebugService C++ and restart", addr, err)
|
msg := fmt.Sprintf("UDP bind on %s failed: %v — rebuild DebugService C++ and restart", addr, err)
|
||||||
log.Printf("[debug-udp] %s", msg)
|
log.Printf("[debug-udp] %s", msg)
|
||||||
broadcastHub(m.hub, map[string]any{
|
m.sink(map[string]any{
|
||||||
"type": "log", "time": time.Now().Format("15:04:05.000"),
|
"type": "log", "time": time.Now().Format("15:04:05.000"),
|
||||||
"level": "ERROR", "message": msg,
|
"level": "ERROR", "message": msg,
|
||||||
})
|
})
|
||||||
@@ -861,7 +891,7 @@ func (m *MarteController) runDebugUDP(host string, port int) {
|
|||||||
conn.SetReadBuffer(10 * 1024 * 1024)
|
conn.SetReadBuffer(10 * 1024 * 1024)
|
||||||
|
|
||||||
log.Printf("[debug-udp] listening on %s for UDPS packets", addr)
|
log.Printf("[debug-udp] listening on %s for UDPS packets", addr)
|
||||||
broadcastHub(m.hub, map[string]any{
|
m.sink(map[string]any{
|
||||||
"type": "log", "time": time.Now().Format("15:04:05.000"),
|
"type": "log", "time": time.Now().Format("15:04:05.000"),
|
||||||
"level": "INFO", "message": fmt.Sprintf("UDP listener bound on %s", addr),
|
"level": "INFO", "message": fmt.Sprintf("UDP listener bound on %s", addr),
|
||||||
})
|
})
|
||||||
@@ -914,8 +944,10 @@ func (m *MarteController) runDebugUDP(host string, port int) {
|
|||||||
sigs = m.translateSignalNames(sigs)
|
sigs = m.translateSignalNames(sigs)
|
||||||
currentSigs = sigs
|
currentSigs = sigs
|
||||||
currentPublishMode = pm
|
currentPublishMode = pm
|
||||||
m.hub.UpdateConfigForSource("debug", sigs)
|
if m.hub != nil {
|
||||||
m.hub.SetSourceState("debug", "connected")
|
m.hub.UpdateConfigForSource("debug", sigs)
|
||||||
|
m.hub.SetSourceState("debug", "connected")
|
||||||
|
}
|
||||||
|
|
||||||
case udpsprotocol.PktData:
|
case udpsprotocol.PktData:
|
||||||
if len(currentSigs) == 0 {
|
if len(currentSigs) == 0 {
|
||||||
@@ -937,8 +969,10 @@ func (m *MarteController) runDebugUDP(host string, port int) {
|
|||||||
log.Printf("[debug-udp] parse data: %v", err)
|
log.Printf("[debug-udp] parse data: %v", err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
for _, s := range samples {
|
if m.hub != nil {
|
||||||
m.hub.PushDataForSource("debug", s)
|
for _, s := range samples {
|
||||||
|
m.hub.PushDataForSource("debug", s)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -972,7 +1006,7 @@ func (m *MarteController) runLog(host string, port int) {
|
|||||||
}
|
}
|
||||||
level := rest[:idx]
|
level := rest[:idx]
|
||||||
msg := rest[idx+1:]
|
msg := rest[idx+1:]
|
||||||
broadcastHub(m.hub, map[string]any{
|
m.sink(map[string]any{
|
||||||
"type": "log",
|
"type": "log",
|
||||||
"time": time.Now().Format("15:04:05.000"),
|
"time": time.Now().Format("15:04:05.000"),
|
||||||
"level": level,
|
"level": level,
|
||||||
@@ -10,6 +10,8 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
|
"marte2debugger/controller"
|
||||||
|
|
||||||
"marte2/common/wshub"
|
"marte2/common/wshub"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -21,7 +23,7 @@ var staticFiles embed.FS
|
|||||||
func main() {
|
func main() {
|
||||||
addr := flag.String("addr", ":7777", "HTTP listen address")
|
addr := flag.String("addr", ":7777", "HTTP listen address")
|
||||||
sourcesFile := flag.String("sources-file", "", "JSON file for persistent source list")
|
sourcesFile := flag.String("sources-file", "", "JSON file for persistent source list")
|
||||||
flag.BoolVar(&dangerousCommandsEnabled, "enable-dangerous-commands", false,
|
flag.BoolVar(&controller.DangerousCommandsEnabled, "enable-dangerous-commands", false,
|
||||||
"Allow FORCE/PAUSE/RESUME/STEP/BREAK/MSG commands from the browser (CR-4 safety gate)")
|
"Allow FORCE/PAUSE/RESUME/STEP/BREAK/MSG commands from the browser (CR-4 safety gate)")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
@@ -29,7 +31,7 @@ func main() {
|
|||||||
sm := wshub.NewSourceManager(hub, *sourcesFile)
|
sm := wshub.NewSourceManager(hub, *sourcesFile)
|
||||||
hub.SetSourceManager(sm)
|
hub.SetSourceManager(sm)
|
||||||
|
|
||||||
ctrl := NewMarteController(hub)
|
ctrl := controller.NewMarteController(hub)
|
||||||
|
|
||||||
go hub.Run()
|
go hub.Run()
|
||||||
|
|
||||||
|
|||||||
+10
-14
@@ -199,28 +199,24 @@ make -f Makefile.gcc test
|
|||||||
# SignalRingBuffer (ReadSince / binary-search ReadRange / wrap),
|
# SignalRingBuffer (ReadSince / binary-search ReadRange / wrap),
|
||||||
# TriggerEngine FSM, LTTB — sources in Test/Applications/StreamHub/
|
# TriggerEngine FSM, LTTB — sources in Test/Applications/StreamHub/
|
||||||
|
|
||||||
./run_e2e_test.sh # full-stack E2E (see below)
|
cd Test/E2E/suite && ./run_e2e.sh # full-stack E2E (see below)
|
||||||
./run_streamhub.sh -w -g # interactive demo stack
|
./run_streamhub.sh -w -g # interactive demo stack
|
||||||
```
|
```
|
||||||
|
|
||||||
### End-to-end test
|
### End-to-end test
|
||||||
|
|
||||||
`./run_e2e_test.sh` builds everything, launches the demo MARTe2 application
|
`Test/E2E/suite/run_e2e.sh` is the unified E2E suite covering the whole
|
||||||
(`Test/Configurations/streamhub_demo.cfg`: 3 UDPStreamers — multicast scalars,
|
streaming + debug chain (`chain`/`direct`/`recorder`/`debug`/`tcplogger`
|
||||||
FirstSample/LastSample arrays, FullArray + uint64 ns time array) plus a
|
scenario kinds, see `Test/E2E/suite/scenarios.py`), including StreamHub live
|
||||||
StreamHub on port 8095 (with history enabled in `/tmp/streamhub_e2e_history`),
|
push, zoom, window and trigger checks via the Go `chain-client`. It builds
|
||||||
then runs the Go WS client `Test/E2E/streamhub` which verifies:
|
everything, runs the scenario matrix plus the stress matrix, and produces a
|
||||||
`sources`/`config` events, ≥10 binary v1 pushes with wall-clock and strictly
|
consolidated `report_data.json` + Typst PDF report
|
||||||
monotonic time on all streams, `stats` shape, a `zoom` round-trip (reqId echo,
|
(`Test/E2E/suite/E2E_Report.typ`). See the script's `--help` for options.
|
||||||
unicast), `historyInfo` broadcast (enabled, duration, decimation, signal count),
|
|
||||||
a `historyZoom` round-trip (reqId echo, signal data), and a complete trigger
|
|
||||||
cycle (setTrigger → arm → binary v2 capture → triggered → disarm). Logs land
|
|
||||||
in `/tmp/streamhub_e2e_{marte,hub}.log`. Exit 0 iff every check passes.
|
|
||||||
|
|
||||||
When changing the WS protocol, update **in lockstep**: this hub, the Go hub
|
When changing the WS protocol, update **in lockstep**: this hub, the Go hub
|
||||||
(`Common/Client/go/wshub`), the browser SPA (`Client/udpstreamer/static`), the
|
(`Common/Client/go/wshub`), the browser SPA (`Client/udpstreamer/static`), the
|
||||||
ImGui client (`Client/streamhub/Protocol.cpp`), the E2E client
|
ImGui client (`Client/streamhub/Protocol.cpp`), the E2E `chain-client`
|
||||||
(`Test/E2E/streamhub`), and [StreamHub-API.md](StreamHub-API.md).
|
(`Test/E2E/suite/client`), and [StreamHub-API.md](StreamHub-API.md).
|
||||||
|
|
||||||
## 8. Gotchas
|
## 8. Gotchas
|
||||||
|
|
||||||
|
|||||||
@@ -108,7 +108,7 @@ UDPStreamer sources and serves them to oscilloscope clients over WebSocket
|
|||||||
hub-side trigger engine, per-window zoom. Clients: browser SPA
|
hub-side trigger engine, per-window zoom. Clients: browser SPA
|
||||||
(`Client/webui` + `Client/udpstreamer/static`) and native ImGui desktop client
|
(`Client/webui` + `Client/udpstreamer/static`) and native ImGui desktop client
|
||||||
(`Client/streamhub`). Demo: `./run_streamhub.sh -w -g`; E2E test:
|
(`Client/streamhub`). Demo: `./run_streamhub.sh -w -g`; E2E test:
|
||||||
`./run_e2e_test.sh`.
|
`Test/E2E/suite/run_e2e.sh`.
|
||||||
|
|
||||||
See `Docs/StreamHub-UserGuide.md`, `Docs/StreamHub-API.md` and
|
See `Docs/StreamHub-UserGuide.md`, `Docs/StreamHub-API.md` and
|
||||||
`Docs/StreamHub-Developer.md`.
|
`Docs/StreamHub-Developer.md`.
|
||||||
|
|||||||
@@ -520,6 +520,10 @@ ErrorManagement::ErrorType DebugService::Streamer(ExecutionInfo &info) {
|
|||||||
|
|
||||||
// b) Drain traceBuffer — pack each sample into udpsDataPayload
|
// b) Drain traceBuffer — pack each sample into udpsDataPayload
|
||||||
bool anyData = false;
|
bool anyData = false;
|
||||||
|
bool pendingInDrain[UDPS_MAX_SLOTS];
|
||||||
|
for (uint32 i = 0u; i < udpsNumSlots; i++) {
|
||||||
|
pendingInDrain[i] = false;
|
||||||
|
}
|
||||||
uint32 id, size;
|
uint32 id, size;
|
||||||
uint64 ts;
|
uint64 ts;
|
||||||
uint8 udpsSampleBuf[UDPS_MAX_SAMPLE_BYTES];
|
uint8 udpsSampleBuf[UDPS_MAX_SAMPLE_BYTES];
|
||||||
@@ -528,6 +532,18 @@ ErrorManagement::ErrorType DebugService::Streamer(ExecutionInfo &info) {
|
|||||||
// Find matching slot by internalID
|
// Find matching slot by internalID
|
||||||
for (uint32 i = 0u; i < udpsNumSlots; i++) {
|
for (uint32 i = 0u; i < udpsNumSlots; i++) {
|
||||||
if (udpsSlots[i].internalID == id) {
|
if (udpsSlots[i].internalID == id) {
|
||||||
|
if (pendingInDrain[i]) {
|
||||||
|
// This slot already holds an unflushed sample from earlier
|
||||||
|
// in this same drain pass — flush it now instead of
|
||||||
|
// silently overwriting it, or lossless tracing would drop
|
||||||
|
// a real sample whenever the Streamer thread falls behind
|
||||||
|
// by more than one RT cycle.
|
||||||
|
FlushUdpsFrame();
|
||||||
|
for (uint32 j = 0u; j < udpsNumSlots; j++) {
|
||||||
|
pendingInDrain[j] = false;
|
||||||
|
}
|
||||||
|
anyData = false;
|
||||||
|
}
|
||||||
if ((udpsDataPayload != NULL_PTR(uint8 *)) &&
|
if ((udpsDataPayload != NULL_PTR(uint8 *)) &&
|
||||||
(8u + udpsSlots[i].wireOffset + udpsSlots[i].wireSize <= udpsDataPayloadSize)) {
|
(8u + udpsSlots[i].wireOffset + udpsSlots[i].wireSize <= udpsDataPayloadSize)) {
|
||||||
uint32 copySize = size;
|
uint32 copySize = size;
|
||||||
@@ -535,6 +551,7 @@ ErrorManagement::ErrorType DebugService::Streamer(ExecutionInfo &info) {
|
|||||||
memcpy(udpsDataPayload + 8u + udpsSlots[i].wireOffset, udpsSampleBuf, copySize);
|
memcpy(udpsDataPayload + 8u + udpsSlots[i].wireOffset, udpsSampleBuf, copySize);
|
||||||
udpsSlots[i].everFilled = true;
|
udpsSlots[i].everFilled = true;
|
||||||
}
|
}
|
||||||
|
pendingInDrain[i] = true;
|
||||||
anyData = true;
|
anyData = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -542,18 +559,22 @@ ErrorManagement::ErrorType DebugService::Streamer(ExecutionInfo &info) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// c) If we have data, stamp with HRT and send via udpsServer
|
// c) If we have data, stamp with HRT and send via udpsServer
|
||||||
if (anyData && udpsNumSlots > 0u && udpsDataPayload != NULL_PTR(uint8 *)) {
|
if (anyData) {
|
||||||
|
FlushUdpsFrame();
|
||||||
|
} else {
|
||||||
|
Sleep::MSec(1u);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ErrorManagement::NoError;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DebugService::FlushUdpsFrame() {
|
||||||
|
if (udpsNumSlots > 0u && udpsDataPayload != NULL_PTR(uint8 *)) {
|
||||||
uint64 hrt = HighResolutionTimer::Counter();
|
uint64 hrt = HighResolutionTimer::Counter();
|
||||||
memcpy(udpsDataPayload, &hrt, 8u);
|
memcpy(udpsDataPayload, &hrt, 8u);
|
||||||
udpsPacketCounter++;
|
udpsPacketCounter++;
|
||||||
(void)udpsServer.SendData(udpsPacketCounter, udpsDataPayload, udpsDataPayloadSize);
|
(void)udpsServer.SendData(udpsPacketCounter, udpsDataPayload, udpsDataPayloadSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!anyData) {
|
|
||||||
Sleep::MSec(1u);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ErrorManagement::NoError;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -66,6 +66,20 @@ private:
|
|||||||
*/
|
*/
|
||||||
bool SendUDPSConfig();
|
bool SendUDPSConfig();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Stamp the current udpsDataPayload with an HRT timestamp and send
|
||||||
|
* it as one UDPS DATA packet.
|
||||||
|
* @details Factored out of Streamer() so a single drain pass of
|
||||||
|
* traceBuffer can flush more than once per tick — see the
|
||||||
|
* pendingInDrain guard in Streamer(): without an eager flush, a
|
||||||
|
* slot that is written twice within the same drain pass (e.g.
|
||||||
|
* because the Streamer thread was briefly descheduled and two
|
||||||
|
* RT cycles' worth of samples piled up in traceBuffer) would
|
||||||
|
* silently overwrite-and-lose the first of the two samples,
|
||||||
|
* defeating lossless tracing.
|
||||||
|
*/
|
||||||
|
void FlushUdpsFrame();
|
||||||
|
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
// TCP/UDP transport configuration
|
// TCP/UDP transport configuration
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
|
|||||||
@@ -1091,9 +1091,9 @@ void DebugServiceBase::InfoNode(const char8 *path, StreamString &out) {
|
|||||||
Reference ref = ObjectRegistryDatabase::Instance()->Find(path);
|
Reference ref = ObjectRegistryDatabase::Instance()->Find(path);
|
||||||
out += "{";
|
out += "{";
|
||||||
if (ref.IsValid()) {
|
if (ref.IsValid()) {
|
||||||
out += "\"Name\":\"";
|
out += "\"Name\": \"";
|
||||||
EscapeJson(ref->GetName(), out);
|
EscapeJson(ref->GetName(), out);
|
||||||
out += "\",\"Class\":\"";
|
out += "\", \"Class\": \"";
|
||||||
EscapeJson(ref->GetClassProperties()->GetName(), out);
|
EscapeJson(ref->GetClassProperties()->GetName(), out);
|
||||||
out += "\"";
|
out += "\"";
|
||||||
ConfigurationDatabase db;
|
ConfigurationDatabase db;
|
||||||
@@ -1110,7 +1110,7 @@ void DebugServiceBase::InfoNode(const char8 *path, StreamString &out) {
|
|||||||
if (TypeConvert(st, at)) {
|
if (TypeConvert(st, at)) {
|
||||||
out += "\"";
|
out += "\"";
|
||||||
EscapeJson(cn, out);
|
EscapeJson(cn, out);
|
||||||
out += "\":\"";
|
out += "\": \"";
|
||||||
EscapeJson(buf, out);
|
EscapeJson(buf, out);
|
||||||
out += "\"";
|
out += "\"";
|
||||||
if (i < nc - 1u)
|
if (i < nc - 1u)
|
||||||
@@ -1129,8 +1129,8 @@ void DebugServiceBase::InfoNode(const char8 *path, StreamString &out) {
|
|||||||
DebugSignalInfo *s = signals[aliases[i].signalIndex];
|
DebugSignalInfo *s = signals[aliases[i].signalIndex];
|
||||||
const char8 *tn =
|
const char8 *tn =
|
||||||
TypeDescriptor::GetTypeNameFromTypeDescriptor(s->type);
|
TypeDescriptor::GetTypeNameFromTypeDescriptor(s->type);
|
||||||
out.Printf("\"Name\":\"%s\",\"Class\":\"Signal\",\"Type\":\"%s\","
|
out.Printf("\"Name\": \"%s\", \"Class\": \"Signal\", \"Type\": \"%s\", "
|
||||||
"\"ID\":%u",
|
"\"ID\": %u",
|
||||||
s->name.Buffer(), tn ? tn : "Unknown", s->internalID);
|
s->name.Buffer(), tn ? tn : "Unknown", s->internalID);
|
||||||
enrichAlias = aliases[i].name;
|
enrichAlias = aliases[i].name;
|
||||||
found = true;
|
found = true;
|
||||||
@@ -1141,29 +1141,39 @@ void DebugServiceBase::InfoNode(const char8 *path, StreamString &out) {
|
|||||||
if (found)
|
if (found)
|
||||||
EnrichWithConfig(enrichAlias.Buffer(), out);
|
EnrichWithConfig(enrichAlias.Buffer(), out);
|
||||||
else
|
else
|
||||||
out += "\"Error\":\"Object not found\"";
|
out += "\"Error\": \"Object not found\"";
|
||||||
}
|
}
|
||||||
out += "}\nOK INFO\n";
|
out += "}\nOK INFO\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
void DebugServiceBase::ListNodes(const char8 *path, StreamString &out) {
|
void DebugServiceBase::ListNodes(const char8 *path, StreamString &out) {
|
||||||
Reference ref =
|
bool isRoot =
|
||||||
(path == NULL_PTR(const char8 *) || StringHelper::Length(path) == 0 ||
|
(path == NULL_PTR(const char8 *) || StringHelper::Length(path) == 0 ||
|
||||||
StringHelper::Compare(path, "/") == 0)
|
StringHelper::Compare(path, "/") == 0);
|
||||||
? ObjectRegistryDatabase::Instance()
|
|
||||||
: ObjectRegistryDatabase::Instance()->Find(path);
|
// NOTE: ObjectRegistryDatabase::Instance() is a raw, long-lived singleton
|
||||||
|
// pointer that is never itself owned by a Reference. Wrapping it in a
|
||||||
|
// Reference here (as previously done via a ternary) would increment its
|
||||||
|
// reference count and then delete it when the local Reference goes out of
|
||||||
|
// scope, destroying the registry. Keep the root case as a raw pointer.
|
||||||
|
ReferenceContainer *rc = NULL_PTR(ReferenceContainer *);
|
||||||
|
Reference ref;
|
||||||
|
if (isRoot) {
|
||||||
|
rc = ObjectRegistryDatabase::Instance();
|
||||||
|
} else {
|
||||||
|
ref = ObjectRegistryDatabase::Instance()->Find(path);
|
||||||
|
if (ref.IsValid()) {
|
||||||
|
rc = dynamic_cast<ReferenceContainer *>(ref.operator->());
|
||||||
|
}
|
||||||
|
}
|
||||||
out.Printf("Nodes under %s:\n", path ? path : "/");
|
out.Printf("Nodes under %s:\n", path ? path : "/");
|
||||||
if (ref.IsValid()) {
|
if (rc != NULL_PTR(ReferenceContainer *)) {
|
||||||
ReferenceContainer *rc =
|
uint32 n = rc->Size();
|
||||||
dynamic_cast<ReferenceContainer *>(ref.operator->());
|
for (uint32 i = 0u; i < n; i++) {
|
||||||
if (rc != NULL_PTR(ReferenceContainer *)) {
|
Reference c = rc->Get(i);
|
||||||
uint32 n = rc->Size();
|
if (c.IsValid()) {
|
||||||
for (uint32 i = 0u; i < n; i++) {
|
out.Printf(" %s [%s]\n", c->GetName(),
|
||||||
Reference c = rc->Get(i);
|
c->GetClassProperties()->GetName());
|
||||||
if (c.IsValid()) {
|
|
||||||
out.Printf(" %s [%s]\n", c->GetName(),
|
|
||||||
c->GetClassProperties()->GetName());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -1198,141 +1208,6 @@ void DebugServiceBase::RebuildConfigFromRegistry() {
|
|||||||
RebuildTransportConfig();
|
RebuildTransportConfig();
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
|
||||||
// Tree export
|
|
||||||
// ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
uint32 DebugServiceBase::ExportTree(ReferenceContainer *container,
|
|
||||||
StreamString &json,
|
|
||||||
const char8 *pathPrefix) {
|
|
||||||
if (container == NULL_PTR(ReferenceContainer *))
|
|
||||||
return 0u;
|
|
||||||
uint32 size = container->Size();
|
|
||||||
uint32 valid = 0u;
|
|
||||||
for (uint32 i = 0u; i < size; i++) {
|
|
||||||
Reference child = container->Get(i);
|
|
||||||
if (!child.IsValid())
|
|
||||||
continue;
|
|
||||||
if (valid > 0u)
|
|
||||||
json += ",\n";
|
|
||||||
const char8 *cname = child->GetName();
|
|
||||||
if (cname == NULL_PTR(const char8 *))
|
|
||||||
cname = "unnamed";
|
|
||||||
StreamString cp;
|
|
||||||
if (pathPrefix != NULL_PTR(const char8 *))
|
|
||||||
cp.Printf("%s.%s", pathPrefix, cname);
|
|
||||||
else
|
|
||||||
cp = cname;
|
|
||||||
|
|
||||||
StreamString nj;
|
|
||||||
nj += "{\"Name\":\"";
|
|
||||||
EscapeJson(cname, nj);
|
|
||||||
nj += "\",\"Class\":\"";
|
|
||||||
EscapeJson(child->GetClassProperties()->GetName(), nj);
|
|
||||||
nj += "\"";
|
|
||||||
|
|
||||||
ReferenceContainer *inner =
|
|
||||||
dynamic_cast<ReferenceContainer *>(child.operator->());
|
|
||||||
DataSourceI *ds = dynamic_cast<DataSourceI *>(child.operator->());
|
|
||||||
GAM *gam = dynamic_cast<GAM *>(child.operator->());
|
|
||||||
|
|
||||||
if (inner != NULL_PTR(ReferenceContainer *) ||
|
|
||||||
ds != NULL_PTR(DataSourceI *) || gam != NULL_PTR(GAM *)) {
|
|
||||||
nj += ",\"Children\":[\n";
|
|
||||||
uint32 sc = 0u;
|
|
||||||
if (inner != NULL_PTR(ReferenceContainer *))
|
|
||||||
sc += ExportTree(inner, nj, cp.Buffer());
|
|
||||||
if (ds != NULL_PTR(DataSourceI *)) {
|
|
||||||
uint32 ns = ds->GetNumberOfSignals();
|
|
||||||
for (uint32 j = 0u; j < ns; j++) {
|
|
||||||
if (sc > 0u) {
|
|
||||||
nj += ",\n";
|
|
||||||
}
|
|
||||||
sc++;
|
|
||||||
StreamString sn;
|
|
||||||
(void)ds->GetSignalName(j, sn);
|
|
||||||
const char8 *st = TypeDescriptor::GetTypeNameFromTypeDescriptor(
|
|
||||||
ds->GetSignalType(j));
|
|
||||||
uint8 d = 0u;
|
|
||||||
(void)ds->GetSignalNumberOfDimensions(j, d);
|
|
||||||
uint32 el = 0u;
|
|
||||||
(void)ds->GetSignalNumberOfElements(j, el);
|
|
||||||
StreamString sfp;
|
|
||||||
sfp.Printf("%s.%s", cp.Buffer(), sn.Buffer());
|
|
||||||
bool tr = false, fo = false;
|
|
||||||
(void)IsInstrumented(sfp.Buffer(), tr, fo);
|
|
||||||
nj += "{\"Name\":\"";
|
|
||||||
EscapeJson(sn.Buffer(), nj);
|
|
||||||
nj += "\",\"Class\":\"Signal\",\"Type\":\"";
|
|
||||||
EscapeJson(st ? st : "Unknown", nj);
|
|
||||||
nj.Printf("\",\"Dimensions\":%u,\"Elements\":%u,"
|
|
||||||
"\"IsTraceable\":%s,\"IsForcable\":%s}",
|
|
||||||
d, el, tr ? "true" : "false", fo ? "true" : "false");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (gam != NULL_PTR(GAM *)) {
|
|
||||||
uint32 nIn = gam->GetNumberOfInputSignals();
|
|
||||||
for (uint32 j = 0u; j < nIn; j++) {
|
|
||||||
if (sc > 0u) {
|
|
||||||
nj += ",\n";
|
|
||||||
}
|
|
||||||
sc++;
|
|
||||||
StreamString sn;
|
|
||||||
(void)gam->GetSignalName(InputSignals, j, sn);
|
|
||||||
const char8 *st = TypeDescriptor::GetTypeNameFromTypeDescriptor(
|
|
||||||
gam->GetSignalType(InputSignals, j));
|
|
||||||
uint32 d = 0u;
|
|
||||||
(void)gam->GetSignalNumberOfDimensions(InputSignals, j, d);
|
|
||||||
uint32 el = 0u;
|
|
||||||
(void)gam->GetSignalNumberOfElements(InputSignals, j, el);
|
|
||||||
StreamString sfp;
|
|
||||||
sfp.Printf("%s.In.%s", cp.Buffer(), sn.Buffer());
|
|
||||||
bool tr = false, fo = false;
|
|
||||||
(void)IsInstrumented(sfp.Buffer(), tr, fo);
|
|
||||||
nj += "{\"Name\":\"In.";
|
|
||||||
EscapeJson(sn.Buffer(), nj);
|
|
||||||
nj += "\",\"Class\":\"InputSignal\",\"Type\":\"";
|
|
||||||
EscapeJson(st ? st : "Unknown", nj);
|
|
||||||
nj.Printf("\",\"Dimensions\":%u,\"Elements\":%u,"
|
|
||||||
"\"IsTraceable\":%s,\"IsForcable\":%s}",
|
|
||||||
d, el, tr ? "true" : "false", fo ? "true" : "false");
|
|
||||||
}
|
|
||||||
uint32 nOut = gam->GetNumberOfOutputSignals();
|
|
||||||
for (uint32 j = 0u; j < nOut; j++) {
|
|
||||||
if (sc > 0u) {
|
|
||||||
nj += ",\n";
|
|
||||||
}
|
|
||||||
sc++;
|
|
||||||
StreamString sn;
|
|
||||||
(void)gam->GetSignalName(OutputSignals, j, sn);
|
|
||||||
const char8 *st = TypeDescriptor::GetTypeNameFromTypeDescriptor(
|
|
||||||
gam->GetSignalType(OutputSignals, j));
|
|
||||||
uint32 d = 0u;
|
|
||||||
(void)gam->GetSignalNumberOfDimensions(OutputSignals, j, d);
|
|
||||||
uint32 el = 0u;
|
|
||||||
(void)gam->GetSignalNumberOfElements(OutputSignals, j, el);
|
|
||||||
StreamString sfp;
|
|
||||||
sfp.Printf("%s.Out.%s", cp.Buffer(), sn.Buffer());
|
|
||||||
bool tr = false, fo = false;
|
|
||||||
(void)IsInstrumented(sfp.Buffer(), tr, fo);
|
|
||||||
nj += "{\"Name\":\"Out.";
|
|
||||||
EscapeJson(sn.Buffer(), nj);
|
|
||||||
nj += "\",\"Class\":\"OutputSignal\",\"Type\":\"";
|
|
||||||
EscapeJson(st ? st : "Unknown", nj);
|
|
||||||
nj.Printf("\",\"Dimensions\":%u,\"Elements\":%u,"
|
|
||||||
"\"IsTraceable\":%s,\"IsForcable\":%s}",
|
|
||||||
d, el, tr ? "true" : "false", fo ? "true" : "false");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
nj += "\n]";
|
|
||||||
}
|
|
||||||
nj += "}";
|
|
||||||
json += nj;
|
|
||||||
valid++;
|
|
||||||
}
|
|
||||||
return valid;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
// EnrichWithConfig
|
// EnrichWithConfig
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -174,8 +174,6 @@ protected:
|
|||||||
void UpdateBrokersBreakStatus();
|
void UpdateBrokersBreakStatus();
|
||||||
void PatchRegistry();
|
void PatchRegistry();
|
||||||
|
|
||||||
uint32 ExportTree(ReferenceContainer *container, StreamString &json,
|
|
||||||
const char8 *pathPrefix);
|
|
||||||
void ExportTreeNode(const char8 *path, StreamString &out);
|
void ExportTreeNode(const char8 *path, StreamString &out);
|
||||||
void EnrichWithConfig(const char8 *path, StreamString &json);
|
void EnrichWithConfig(const char8 *path, StreamString &json);
|
||||||
static void JsonifyDatabase(ConfigurationDatabase &db, StreamString &json);
|
static void JsonifyDatabase(ConfigurationDatabase &db, StreamString &json);
|
||||||
|
|||||||
@@ -9,8 +9,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
#include <cstdint>
|
#include "GeneralDefinitions.h"
|
||||||
#include <cstring>
|
|
||||||
|
|
||||||
// HI-1: Verify that a 64-bit bounds check rejects a payload where
|
// HI-1: Verify that a 64-bit bounds check rejects a payload where
|
||||||
// elemsToRead * wireElemBytes would overflow uint32.
|
// elemsToRead * wireElemBytes would overflow uint32.
|
||||||
@@ -18,56 +17,57 @@ TEST(BoundsCheckTest, OverflowRejected) {
|
|||||||
// Simulate: numSamples = 0x20000001, wireElemBytes = 8
|
// Simulate: numSamples = 0x20000001, wireElemBytes = 8
|
||||||
// 32-bit: 0x20000001 * 8 = 0x8 (overflow!)
|
// 32-bit: 0x20000001 * 8 = 0x8 (overflow!)
|
||||||
// 64-bit: 0x100000008 (correctly large, > any reasonable payload size)
|
// 64-bit: 0x100000008 (correctly large, > any reasonable payload size)
|
||||||
uint32_t elemsToRead = 0x20000001u;
|
MARTe::uint32 elemsToRead = 0x20000001u;
|
||||||
uint32_t wireElemBytes = 8u;
|
MARTe::uint32 wireElemBytes = 8u;
|
||||||
uint32_t off = 12u; // after HRT + numSamples
|
MARTe::uint32 off = 12u; // after HRT + numSamples
|
||||||
uint32_t size = 1400u; // typical max payload
|
MARTe::uint32 size = 1400u; // typical max payload
|
||||||
|
|
||||||
// This is the FIXED pattern (64-bit):
|
// This is the FIXED pattern (64-bit):
|
||||||
uint64_t bytesNeeded = static_cast<uint64_t>(off) +
|
MARTe::uint64 bytesNeeded = static_cast<MARTe::uint64>(off) +
|
||||||
static_cast<uint64_t>(elemsToRead) *
|
static_cast<MARTe::uint64>(elemsToRead) *
|
||||||
static_cast<uint64_t>(wireElemBytes);
|
static_cast<MARTe::uint64>(wireElemBytes);
|
||||||
// Should reject (bytesNeeded >> size)
|
// Should reject (bytesNeeded >> size)
|
||||||
EXPECT_GT(bytesNeeded, static_cast<uint64_t>(size))
|
EXPECT_GT(bytesNeeded, static_cast<MARTe::uint64>(size))
|
||||||
<< "64-bit check should detect overflow that 32-bit would miss";
|
<< "64-bit check should detect overflow that 32-bit would miss";
|
||||||
|
|
||||||
// Verify the OLD (buggy) 32-bit pattern would have passed:
|
// Verify the OLD (buggy) 32-bit pattern would have passed:
|
||||||
uint32_t oldCheck = off + (elemsToRead * wireElemBytes);
|
MARTe::uint32 oldCheck = off + (elemsToRead * wireElemBytes);
|
||||||
// On 32-bit: 0x20000001 * 8 = 0x100000008 truncated to 0x8
|
// On 32-bit: 0x20000001 * 8 = 0x100000008 truncated to 0x8
|
||||||
// off + 0x8 = 20, which is < 1400, so the old check would pass (bug!)
|
// off + 0x8 = 20, which is < 1400, so the old check would pass (bug!)
|
||||||
// On 64-bit: the multiply doesn't overflow, so oldCheck is huge
|
// On 64-bit: the multiply doesn't overflow, so oldCheck is huge
|
||||||
// This test documents that the 64-bit fix is necessary on 32-bit platforms
|
// This test documents that the 64-bit fix is necessary on 32-bit platforms
|
||||||
// and correct on 64-bit.
|
// and correct on 64-bit.
|
||||||
|
(void) oldCheck;
|
||||||
}
|
}
|
||||||
|
|
||||||
// HI-1: Verify a normal (non-overflow) case passes the 64-bit check.
|
// HI-1: Verify a normal (non-overflow) case passes the 64-bit check.
|
||||||
TEST(BoundsCheckTest, NormalCasePasses) {
|
TEST(BoundsCheckTest, NormalCasePasses) {
|
||||||
uint32_t elemsToRead = 100u;
|
MARTe::uint32 elemsToRead = 100u;
|
||||||
uint32_t wireElemBytes = 4u;
|
MARTe::uint32 wireElemBytes = 4u;
|
||||||
uint32_t off = 12u;
|
MARTe::uint32 off = 12u;
|
||||||
uint32_t size = 500u;
|
MARTe::uint32 size = 500u;
|
||||||
|
|
||||||
uint64_t bytesNeeded = static_cast<uint64_t>(off) +
|
MARTe::uint64 bytesNeeded = static_cast<MARTe::uint64>(off) +
|
||||||
static_cast<uint64_t>(elemsToRead) *
|
static_cast<MARTe::uint64>(elemsToRead) *
|
||||||
static_cast<uint64_t>(wireElemBytes);
|
static_cast<MARTe::uint64>(wireElemBytes);
|
||||||
EXPECT_LE(bytesNeeded, static_cast<uint64_t>(size))
|
EXPECT_LE(bytesNeeded, static_cast<MARTe::uint64>(size))
|
||||||
<< "normal case should pass the bounds check";
|
<< "normal case should pass the bounds check";
|
||||||
}
|
}
|
||||||
|
|
||||||
// HI-1: Verify numRows * numCols overflow is detected.
|
// HI-1: Verify numRows * numCols overflow is detected.
|
||||||
TEST(BoundsCheckTest, NumRowsNumColsOverflow) {
|
TEST(BoundsCheckTest, NumRowsNumColsOverflow) {
|
||||||
uint32_t numRows = 0x10000u;
|
MARTe::uint32 numRows = 0x10000u;
|
||||||
uint32_t numCols = 0x10000u;
|
MARTe::uint32 numCols = 0x10000u;
|
||||||
|
|
||||||
// 32-bit: 0x10000 * 0x10000 = 0 (overflow!)
|
// 32-bit: 0x10000 * 0x10000 = 0 (overflow!)
|
||||||
uint32_t oldResult = numRows * numCols;
|
MARTe::uint32 oldResult = numRows * numCols;
|
||||||
EXPECT_EQ(oldResult, 0u) << "32-bit multiply should overflow to 0";
|
EXPECT_EQ(oldResult, 0u) << "32-bit multiply should overflow to 0";
|
||||||
|
|
||||||
// 64-bit fix:
|
// 64-bit fix:
|
||||||
uint64_t newResult = static_cast<uint64_t>(numRows) *
|
MARTe::uint64 newResult = static_cast<MARTe::uint64>(numRows) *
|
||||||
static_cast<uint64_t>(numCols);
|
static_cast<MARTe::uint64>(numCols);
|
||||||
EXPECT_EQ(newResult, static_cast<uint64_t>(0x100000000u))
|
EXPECT_EQ(newResult, static_cast<MARTe::uint64>(0x100000000ULL))
|
||||||
<< "64-bit multiply should give correct result";
|
<< "64-bit multiply should give correct result";
|
||||||
EXPECT_GT(newResult, static_cast<uint64_t>(0x100000u))
|
EXPECT_GT(newResult, static_cast<MARTe::uint64>(0x100000u))
|
||||||
<< "should exceed the sanity cap, triggering rejection";
|
<< "should exceed the sanity cap, triggering rejection";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
#
|
#
|
||||||
#############################################################
|
#############################################################
|
||||||
|
|
||||||
OBJSX = TriggerEngineSrc.x BinaryRecorderSrc.x SignalRingBufferGTest.x TriggerEngineGTest.x LTTBGTest.x BinaryRecorderGTest.x
|
OBJSX = TriggerEngineSrc.x BinaryRecorderSrc.x SignalRingBufferGTest.x TriggerEngineGTest.x LTTBGTest.x BinaryRecorderGTest.x BoundsCheckTest.x WSServerBufferTest.x
|
||||||
|
|
||||||
PACKAGE=Applications
|
PACKAGE=Applications
|
||||||
ROOT_DIR=../../..
|
ROOT_DIR=../../..
|
||||||
|
|||||||
@@ -0,0 +1,427 @@
|
|||||||
|
../../../Build/x86-linux/Applications/StreamHub/BinaryRecorderGTest.o: BinaryRecorderGTest.cpp \
|
||||||
|
../../../Source/Applications/StreamHub/BinaryRecorder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Architecture/x86_gcc/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TypeDescriptor.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BasicType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/FractionalInteger.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TypeCharacteristics.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TemplateParametersVerificator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitRange.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitBoolean.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/FastPollingMutexSem.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Atomic.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TypeCharacteristics.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Architecture/x86_gcc/AtomicA.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorManagement.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorInformation.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/ErrorType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitBoolean.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitRange.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StreamI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeoutType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeStamp.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Architecture/x86_gcc/HighResolutionTimerA.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/HighResolutionTimerCalibrator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeStamp.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Sleep.h \
|
||||||
|
../../../Common/UDP/UDPSProtocol.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-internal.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-port.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-message.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-string.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-filepath.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-death-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-death-test-internal.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-param-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-param-util.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-linked_ptr.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-printers.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest_prod.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-test-part.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-typed-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest_pred_impl.h
|
||||||
|
../../../Build/x86-linux/Applications/StreamHub/BinaryRecorderSrc.o: BinaryRecorderSrc.cpp \
|
||||||
|
../../../Source/Applications/StreamHub/BinaryRecorder.cpp \
|
||||||
|
../../../Source/Applications/StreamHub/BinaryRecorder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Architecture/x86_gcc/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TypeDescriptor.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BasicType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/FractionalInteger.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TypeCharacteristics.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TemplateParametersVerificator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitRange.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitBoolean.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/FastPollingMutexSem.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Atomic.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TypeCharacteristics.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Architecture/x86_gcc/AtomicA.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorManagement.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorInformation.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/ErrorType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitBoolean.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitRange.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StreamI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeoutType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeStamp.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Architecture/x86_gcc/HighResolutionTimerA.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/HighResolutionTimerCalibrator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeStamp.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Sleep.h \
|
||||||
|
../../../Common/UDP/UDPSProtocol.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/AdvancedErrorManagement.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassProperties.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/FractionalInteger.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorManagement.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/StreamMemoryReference.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/BufferedStreamI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeoutType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/AnyType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassProperties.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassRegistryDatabase.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GlobalObjectsDatabase.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GlobalObjectI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/StandardHeap.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../HeapI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../ErrorManagement.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../Generic/StandardHeap_Generic.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassRegistryItem.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CString.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/ZeroTerminatedArray.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/Introspection.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/IntrospectionEntry.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/ZeroTerminatedArray.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListable.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListHolderT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/IteratorT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Iterator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListable.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListHolder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/SortFilter.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/SearchFilter.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/LoadableLibrary.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ObjectBuilder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HeapI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StaticList.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StaticListHolder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Matrix.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Vector.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HeapManager.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HeapI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/MemoryOperationsHelper.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/FormatDescriptor.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/IOBuffer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/CharBuffer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StreamI.h
|
||||||
|
../../../Build/x86-linux/Applications/StreamHub/BoundsCheckTest.o: BoundsCheckTest.cpp \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-internal.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-port.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-message.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-string.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-filepath.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-death-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-death-test-internal.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-param-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-param-util.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-linked_ptr.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-printers.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest_prod.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-test-part.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-typed-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest_pred_impl.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TypeCharacteristics.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Architecture/x86_gcc/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/GeneralDefinitions.h
|
||||||
|
../../../Build/x86-linux/Applications/StreamHub/LTTBGTest.o: LTTBGTest.cpp ../../../Source/Applications/StreamHub/LTTB.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Architecture/x86_gcc/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-internal.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-port.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-message.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-string.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-filepath.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-death-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-death-test-internal.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-param-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-param-util.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-linked_ptr.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-printers.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest_prod.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-test-part.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-typed-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest_pred_impl.h
|
||||||
|
../../../Build/x86-linux/Applications/StreamHub/SignalRingBufferGTest.o: SignalRingBufferGTest.cpp \
|
||||||
|
../../../Source/Applications/StreamHub/SignalRingBuffer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Architecture/x86_gcc/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/FastPollingMutexSem.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Atomic.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TypeCharacteristics.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Architecture/x86_gcc/AtomicA.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorManagement.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorInformation.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/ErrorType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitBoolean.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TemplateParametersVerificator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitRange.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TypeCharacteristics.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StreamI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeoutType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeStamp.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Architecture/x86_gcc/HighResolutionTimerA.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/HighResolutionTimerCalibrator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeStamp.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Sleep.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-internal.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-port.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-message.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-string.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-filepath.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-death-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-death-test-internal.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-param-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-param-util.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-linked_ptr.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-printers.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest_prod.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-test-part.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-typed-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest_pred_impl.h
|
||||||
|
../../../Build/x86-linux/Applications/StreamHub/TriggerEngineGTest.o: TriggerEngineGTest.cpp \
|
||||||
|
../../../Source/Applications/StreamHub/TriggerEngine.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Architecture/x86_gcc/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/FastPollingMutexSem.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Atomic.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TypeCharacteristics.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Architecture/x86_gcc/AtomicA.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorManagement.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorInformation.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/ErrorType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitBoolean.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TemplateParametersVerificator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitRange.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TypeCharacteristics.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StreamI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeoutType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeStamp.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Architecture/x86_gcc/HighResolutionTimerA.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/HighResolutionTimerCalibrator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeStamp.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Sleep.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/StreamString.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HeapManager.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HeapI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/CharBuffer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitBoolean.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorManagement.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/BufferedStreamI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeoutType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/AnyType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassProperties.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/FractionalInteger.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassRegistryDatabase.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GlobalObjectsDatabase.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GlobalObjectI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/StandardHeap.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../HeapI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../Generic/StandardHeap_Generic.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassRegistryItem.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CString.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/ZeroTerminatedArray.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/Introspection.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/IntrospectionEntry.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TypeDescriptor.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BasicType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/FractionalInteger.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitRange.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/ZeroTerminatedArray.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListable.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListHolderT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/IteratorT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Iterator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListable.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListHolder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/SortFilter.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/SearchFilter.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/LoadableLibrary.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ObjectBuilder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HeapI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StaticList.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StaticListHolder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Matrix.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Vector.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/MemoryOperationsHelper.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/FormatDescriptor.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/IOBuffer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StreamI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StringHelper.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/StreamStringIOBuffer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-internal.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-port.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-message.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-string.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-filepath.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-death-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-death-test-internal.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-param-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-param-util.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-linked_ptr.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-printers.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest_prod.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-test-part.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-typed-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest_pred_impl.h
|
||||||
|
../../../Build/x86-linux/Applications/StreamHub/TriggerEngineSrc.o: TriggerEngineSrc.cpp \
|
||||||
|
../../../Source/Applications/StreamHub/TriggerEngine.cpp \
|
||||||
|
../../../Source/Applications/StreamHub/TriggerEngine.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Architecture/x86_gcc/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/FastPollingMutexSem.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Atomic.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TypeCharacteristics.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Architecture/x86_gcc/AtomicA.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorManagement.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorInformation.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/ErrorType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitBoolean.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TemplateParametersVerificator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitRange.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TypeCharacteristics.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StreamI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeoutType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeStamp.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Architecture/x86_gcc/HighResolutionTimerA.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/HighResolutionTimerCalibrator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeStamp.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Sleep.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/StreamString.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HeapManager.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HeapI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/CharBuffer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitBoolean.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorManagement.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/BufferedStreamI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeoutType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/AnyType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassProperties.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/FractionalInteger.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassRegistryDatabase.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GlobalObjectsDatabase.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GlobalObjectI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/StandardHeap.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../HeapI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../Generic/StandardHeap_Generic.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassRegistryItem.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CString.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/ZeroTerminatedArray.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/Introspection.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/IntrospectionEntry.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TypeDescriptor.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BasicType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/FractionalInteger.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitRange.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/ZeroTerminatedArray.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListable.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListHolderT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/IteratorT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Iterator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListable.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListHolder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/SortFilter.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/SearchFilter.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/LoadableLibrary.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ObjectBuilder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HeapI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StaticList.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StaticListHolder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Matrix.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Vector.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/MemoryOperationsHelper.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/FormatDescriptor.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/IOBuffer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StreamI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StringHelper.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/StreamStringIOBuffer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/AdvancedErrorManagement.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassProperties.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/StreamMemoryReference.h
|
||||||
|
../../../Build/x86-linux/Applications/StreamHub/WSServerBufferTest.o: WSServerBufferTest.cpp \
|
||||||
|
../../../Source/Applications/StreamHub/WSFrame.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Architecture/x86_gcc/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-internal.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-port.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-message.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-string.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-filepath.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-death-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-death-test-internal.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-param-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-param-util.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-linked_ptr.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-printers.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest_prod.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-test-part.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-typed-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest_pred_impl.h
|
||||||
@@ -0,0 +1,427 @@
|
|||||||
|
BinaryRecorderGTest.o: BinaryRecorderGTest.cpp \
|
||||||
|
../../../Source/Applications/StreamHub/BinaryRecorder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Architecture/x86_gcc/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TypeDescriptor.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BasicType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/FractionalInteger.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TypeCharacteristics.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TemplateParametersVerificator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitRange.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitBoolean.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/FastPollingMutexSem.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Atomic.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TypeCharacteristics.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Architecture/x86_gcc/AtomicA.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorManagement.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorInformation.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/ErrorType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitBoolean.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitRange.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StreamI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeoutType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeStamp.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Architecture/x86_gcc/HighResolutionTimerA.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/HighResolutionTimerCalibrator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeStamp.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Sleep.h \
|
||||||
|
../../../Common/UDP/UDPSProtocol.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-internal.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-port.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-message.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-string.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-filepath.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-death-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-death-test-internal.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-param-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-param-util.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-linked_ptr.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-printers.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest_prod.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-test-part.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-typed-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest_pred_impl.h
|
||||||
|
BinaryRecorderSrc.o: BinaryRecorderSrc.cpp \
|
||||||
|
../../../Source/Applications/StreamHub/BinaryRecorder.cpp \
|
||||||
|
../../../Source/Applications/StreamHub/BinaryRecorder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Architecture/x86_gcc/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TypeDescriptor.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BasicType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/FractionalInteger.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TypeCharacteristics.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TemplateParametersVerificator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitRange.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitBoolean.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/FastPollingMutexSem.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Atomic.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TypeCharacteristics.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Architecture/x86_gcc/AtomicA.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorManagement.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorInformation.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/ErrorType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitBoolean.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitRange.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StreamI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeoutType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeStamp.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Architecture/x86_gcc/HighResolutionTimerA.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/HighResolutionTimerCalibrator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeStamp.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Sleep.h \
|
||||||
|
../../../Common/UDP/UDPSProtocol.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/AdvancedErrorManagement.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassProperties.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/FractionalInteger.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorManagement.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/StreamMemoryReference.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/BufferedStreamI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeoutType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/AnyType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassProperties.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassRegistryDatabase.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GlobalObjectsDatabase.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GlobalObjectI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/StandardHeap.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../HeapI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../ErrorManagement.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../Generic/StandardHeap_Generic.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassRegistryItem.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CString.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/ZeroTerminatedArray.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/Introspection.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/IntrospectionEntry.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/ZeroTerminatedArray.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListable.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListHolderT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/IteratorT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Iterator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListable.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListHolder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/SortFilter.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/SearchFilter.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/LoadableLibrary.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ObjectBuilder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HeapI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StaticList.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StaticListHolder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Matrix.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Vector.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HeapManager.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HeapI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/MemoryOperationsHelper.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/FormatDescriptor.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/IOBuffer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/CharBuffer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StreamI.h
|
||||||
|
BoundsCheckTest.o: BoundsCheckTest.cpp \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-internal.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-port.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-message.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-string.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-filepath.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-death-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-death-test-internal.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-param-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-param-util.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-linked_ptr.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-printers.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest_prod.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-test-part.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-typed-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest_pred_impl.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TypeCharacteristics.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Architecture/x86_gcc/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/GeneralDefinitions.h
|
||||||
|
LTTBGTest.o: LTTBGTest.cpp ../../../Source/Applications/StreamHub/LTTB.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Architecture/x86_gcc/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-internal.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-port.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-message.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-string.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-filepath.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-death-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-death-test-internal.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-param-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-param-util.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-linked_ptr.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-printers.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest_prod.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-test-part.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-typed-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest_pred_impl.h
|
||||||
|
SignalRingBufferGTest.o: SignalRingBufferGTest.cpp \
|
||||||
|
../../../Source/Applications/StreamHub/SignalRingBuffer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Architecture/x86_gcc/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/FastPollingMutexSem.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Atomic.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TypeCharacteristics.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Architecture/x86_gcc/AtomicA.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorManagement.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorInformation.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/ErrorType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitBoolean.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TemplateParametersVerificator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitRange.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TypeCharacteristics.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StreamI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeoutType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeStamp.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Architecture/x86_gcc/HighResolutionTimerA.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/HighResolutionTimerCalibrator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeStamp.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Sleep.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-internal.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-port.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-message.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-string.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-filepath.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-death-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-death-test-internal.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-param-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-param-util.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-linked_ptr.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-printers.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest_prod.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-test-part.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-typed-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest_pred_impl.h
|
||||||
|
TriggerEngineGTest.o: TriggerEngineGTest.cpp \
|
||||||
|
../../../Source/Applications/StreamHub/TriggerEngine.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Architecture/x86_gcc/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/FastPollingMutexSem.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Atomic.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TypeCharacteristics.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Architecture/x86_gcc/AtomicA.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorManagement.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorInformation.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/ErrorType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitBoolean.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TemplateParametersVerificator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitRange.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TypeCharacteristics.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StreamI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeoutType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeStamp.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Architecture/x86_gcc/HighResolutionTimerA.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/HighResolutionTimerCalibrator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeStamp.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Sleep.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/StreamString.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HeapManager.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HeapI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/CharBuffer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitBoolean.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorManagement.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/BufferedStreamI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeoutType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/AnyType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassProperties.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/FractionalInteger.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassRegistryDatabase.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GlobalObjectsDatabase.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GlobalObjectI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/StandardHeap.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../HeapI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../Generic/StandardHeap_Generic.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassRegistryItem.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CString.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/ZeroTerminatedArray.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/Introspection.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/IntrospectionEntry.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TypeDescriptor.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BasicType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/FractionalInteger.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitRange.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/ZeroTerminatedArray.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListable.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListHolderT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/IteratorT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Iterator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListable.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListHolder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/SortFilter.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/SearchFilter.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/LoadableLibrary.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ObjectBuilder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HeapI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StaticList.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StaticListHolder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Matrix.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Vector.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/MemoryOperationsHelper.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/FormatDescriptor.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/IOBuffer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StreamI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StringHelper.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/StreamStringIOBuffer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-internal.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-port.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-message.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-string.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-filepath.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-death-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-death-test-internal.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-param-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-param-util.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-linked_ptr.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-printers.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest_prod.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-test-part.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-typed-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest_pred_impl.h
|
||||||
|
TriggerEngineSrc.o: TriggerEngineSrc.cpp \
|
||||||
|
../../../Source/Applications/StreamHub/TriggerEngine.cpp \
|
||||||
|
../../../Source/Applications/StreamHub/TriggerEngine.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Architecture/x86_gcc/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/FastPollingMutexSem.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Atomic.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TypeCharacteristics.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Architecture/x86_gcc/AtomicA.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorManagement.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorInformation.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/ErrorType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitBoolean.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TemplateParametersVerificator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitRange.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TypeCharacteristics.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StreamI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeoutType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeStamp.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Architecture/x86_gcc/HighResolutionTimerA.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/HighResolutionTimerCalibrator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeStamp.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Sleep.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/StreamString.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HeapManager.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HeapI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/CharBuffer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitBoolean.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorManagement.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/BufferedStreamI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeoutType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/AnyType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassProperties.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/FractionalInteger.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassRegistryDatabase.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GlobalObjectsDatabase.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GlobalObjectI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/StandardHeap.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../HeapI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../Generic/StandardHeap_Generic.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassRegistryItem.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CString.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/ZeroTerminatedArray.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/Introspection.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/IntrospectionEntry.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TypeDescriptor.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BasicType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/FractionalInteger.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitRange.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/ZeroTerminatedArray.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListable.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListHolderT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/IteratorT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Iterator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListable.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListHolder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/SortFilter.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/SearchFilter.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/LoadableLibrary.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ObjectBuilder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HeapI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StaticList.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StaticListHolder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Matrix.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Vector.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/MemoryOperationsHelper.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/FormatDescriptor.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/IOBuffer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StreamI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StringHelper.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/StreamStringIOBuffer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/AdvancedErrorManagement.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassProperties.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/StreamMemoryReference.h
|
||||||
|
WSServerBufferTest.o: WSServerBufferTest.cpp \
|
||||||
|
../../../Source/Applications/StreamHub/WSFrame.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Architecture/x86_gcc/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-internal.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-port.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-message.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-string.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-filepath.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-death-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-death-test-internal.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-param-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-param-util.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-linked_ptr.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-printers.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest_prod.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-test-part.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-typed-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest_pred_impl.h
|
||||||
@@ -0,0 +1,199 @@
|
|||||||
|
../../../../Build/x86-linux/Components/DataSources/UDPStreamer/UDPStreamerGTest.o: UDPStreamerGTest.cpp \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-internal.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-port.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-message.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-string.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-filepath.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-death-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-death-test-internal.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-param-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-param-util.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-linked_ptr.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-printers.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest_prod.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-test-part.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-typed-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest_pred_impl.h \
|
||||||
|
UDPStreamerTest.h
|
||||||
|
../../../../Build/x86-linux/Components/DataSources/UDPStreamer/UDPStreamerTest.o: UDPStreamerTest.cpp \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/AdvancedErrorManagement.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassProperties.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TypeCharacteristics.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Architecture/x86_gcc/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/FractionalInteger.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TypeCharacteristics.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TemplateParametersVerificator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorManagement.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorInformation.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/ErrorType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitBoolean.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitRange.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StreamI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeoutType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeStamp.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Architecture/x86_gcc/HighResolutionTimerA.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/HighResolutionTimerCalibrator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeStamp.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/StreamMemoryReference.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/BufferedStreamI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeoutType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/AnyType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassProperties.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassRegistryDatabase.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GlobalObjectsDatabase.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GlobalObjectI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/StandardHeap.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../HeapI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../ErrorManagement.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../Generic/StandardHeap_Generic.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/FastPollingMutexSem.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Atomic.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Architecture/x86_gcc/AtomicA.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorManagement.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Sleep.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassRegistryItem.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CString.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/ZeroTerminatedArray.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/Introspection.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/IntrospectionEntry.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TypeDescriptor.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BasicType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/FractionalInteger.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitRange.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitBoolean.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/ZeroTerminatedArray.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListable.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListHolderT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/IteratorT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Iterator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListable.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListHolder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/SortFilter.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/SearchFilter.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/LoadableLibrary.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ObjectBuilder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HeapI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StaticList.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StaticListHolder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Matrix.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Vector.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HeapManager.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HeapI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/MemoryOperationsHelper.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/FormatDescriptor.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/IOBuffer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/CharBuffer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StreamI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/FileSystem/L1Portability/BasicTCPSocket.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/FileSystem/L1Portability/BasicSocket.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/FileSystem/L1Portability/InternetHost.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/StreamString.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StringHelper.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/StreamStringIOBuffer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/FileSystem/L1Portability/Environment/Linux/InternetHostCore.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/FileSystem/L1Portability/Environment/Linux/InternetMulticastCore.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HandleI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/FileSystem/L1Portability/Environment/Linux/SocketCore.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/FileSystem/L1Portability/BasicUDPSocket.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Sleep.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/ConfigurationDatabase.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/AnyObject.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/Object.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/StructuredDataI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/AnyType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/CLASSREGISTER.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassRegistryItemT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ObjectBuilderT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/ConfigurationDatabaseNode.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Fnv1aHashFunction.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/HashFunction.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ReferenceContainer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListHolder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/Object.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/Reference.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ReferenceContainerFilter.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ReferenceContainerNode.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ReferenceT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/UnorderedMap.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HeapManager.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StringHelper.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ReferenceContainerFilterObjectName.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ReferenceContainer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/StructuredDataI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/TypeConversion.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Vector.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/GAM.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/DataSourceI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/StatefulI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/ExecutableI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L5GAMs/GAMScheduler.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L1Portability/EventSem.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/GAMSchedulerI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/GAM.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ProcessorType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitSet.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/TimingDataSource.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/GAMDataSource.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/MemoryArea.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Messages/Message.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L3Services/MultiThreadService.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L3Services/EmbeddedServiceI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L3Services/EmbeddedServiceMethodBinderI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L3Services/ExecutionInfo.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L1Portability/Threads.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ThreadsB.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L1Portability/ExceptionHandler.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L3Services/EmbeddedServiceMethodBinderT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L3Services/EmbeddedThreadI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L3Services/SingleThreadService.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L3Services/EmbeddedThread.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/RealTimeApplication.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/CLASSMETHODREGISTER.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassMethodInterfaceMapper.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassMethodCaller.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassMethodCallerT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ReferenceT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/GAMSchedulerI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Messages/MessageI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Messages/Message.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Messages/MessageFilterPool.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Messages/MessageFilter.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/RealTimeApplicationConfigurationBuilder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/RealTimeApplication.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Messages/RegisteredMethodsMessageFilter.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ObjectRegistryDatabase.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/StandardParser.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/ConfigurationParserI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/AnyTypeCreator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StaticListHolder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/ConfigurationDatabase.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/LexicalAnalyzer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/GrammarInfo.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/Token.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/TokenInfo.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/ParserI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/RuntimeEvaluator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/IteratorT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StaticStack.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StaticList.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/VariableInformation.h \
|
||||||
|
../../../../Source/Components/DataSources/UDPStreamer/UDPStreamer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L3Services/EmbeddedServiceMethodBinderI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/MemoryDataSourceI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L3Services/SingleThreadService.h \
|
||||||
|
../../../../Source/Components/Interfaces/UDPStream/UDPSServer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/FileSystem/L1Portability/InternetHost.h \
|
||||||
|
../../../../Common/UDP/UDPSProtocol.h UDPStreamerTest.h
|
||||||
@@ -0,0 +1,199 @@
|
|||||||
|
UDPStreamerGTest.o: UDPStreamerGTest.cpp \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-internal.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-port.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-message.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-string.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-filepath.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-death-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-death-test-internal.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-param-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-param-util.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-linked_ptr.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-printers.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest_prod.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-test-part.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-typed-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest_pred_impl.h \
|
||||||
|
UDPStreamerTest.h
|
||||||
|
UDPStreamerTest.o: UDPStreamerTest.cpp \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/AdvancedErrorManagement.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassProperties.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TypeCharacteristics.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Architecture/x86_gcc/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/FractionalInteger.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TypeCharacteristics.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TemplateParametersVerificator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorManagement.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorInformation.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/ErrorType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitBoolean.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitRange.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StreamI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeoutType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeStamp.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Architecture/x86_gcc/HighResolutionTimerA.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/HighResolutionTimerCalibrator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeStamp.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/StreamMemoryReference.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/BufferedStreamI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeoutType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/AnyType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassProperties.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassRegistryDatabase.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GlobalObjectsDatabase.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GlobalObjectI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/StandardHeap.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../HeapI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../ErrorManagement.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../Generic/StandardHeap_Generic.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/FastPollingMutexSem.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Atomic.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Architecture/x86_gcc/AtomicA.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorManagement.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Sleep.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassRegistryItem.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CString.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/ZeroTerminatedArray.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/Introspection.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/IntrospectionEntry.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TypeDescriptor.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BasicType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/FractionalInteger.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitRange.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitBoolean.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/ZeroTerminatedArray.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListable.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListHolderT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/IteratorT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Iterator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListable.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListHolder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/SortFilter.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/SearchFilter.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/LoadableLibrary.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ObjectBuilder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HeapI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StaticList.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StaticListHolder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Matrix.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Vector.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HeapManager.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HeapI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/MemoryOperationsHelper.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/FormatDescriptor.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/IOBuffer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/CharBuffer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StreamI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/FileSystem/L1Portability/BasicTCPSocket.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/FileSystem/L1Portability/BasicSocket.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/FileSystem/L1Portability/InternetHost.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/StreamString.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StringHelper.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/StreamStringIOBuffer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/FileSystem/L1Portability/Environment/Linux/InternetHostCore.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/FileSystem/L1Portability/Environment/Linux/InternetMulticastCore.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HandleI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/FileSystem/L1Portability/Environment/Linux/SocketCore.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/FileSystem/L1Portability/BasicUDPSocket.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Sleep.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/ConfigurationDatabase.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/AnyObject.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/Object.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/StructuredDataI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/AnyType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/CLASSREGISTER.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassRegistryItemT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ObjectBuilderT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/ConfigurationDatabaseNode.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Fnv1aHashFunction.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/HashFunction.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ReferenceContainer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListHolder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/Object.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/Reference.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ReferenceContainerFilter.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ReferenceContainerNode.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ReferenceT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/UnorderedMap.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HeapManager.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StringHelper.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ReferenceContainerFilterObjectName.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ReferenceContainer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/StructuredDataI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/TypeConversion.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Vector.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/GAM.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/DataSourceI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/StatefulI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/ExecutableI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L5GAMs/GAMScheduler.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L1Portability/EventSem.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/GAMSchedulerI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/GAM.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ProcessorType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitSet.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/TimingDataSource.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/GAMDataSource.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/MemoryArea.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Messages/Message.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L3Services/MultiThreadService.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L3Services/EmbeddedServiceI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L3Services/EmbeddedServiceMethodBinderI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L3Services/ExecutionInfo.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L1Portability/Threads.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ThreadsB.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L1Portability/ExceptionHandler.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L3Services/EmbeddedServiceMethodBinderT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L3Services/EmbeddedThreadI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L3Services/SingleThreadService.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L3Services/EmbeddedThread.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/RealTimeApplication.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/CLASSMETHODREGISTER.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassMethodInterfaceMapper.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassMethodCaller.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassMethodCallerT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ReferenceT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/GAMSchedulerI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Messages/MessageI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Messages/Message.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Messages/MessageFilterPool.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Messages/MessageFilter.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/RealTimeApplicationConfigurationBuilder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/RealTimeApplication.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Messages/RegisteredMethodsMessageFilter.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ObjectRegistryDatabase.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/StandardParser.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/ConfigurationParserI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/AnyTypeCreator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StaticListHolder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/ConfigurationDatabase.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/LexicalAnalyzer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/GrammarInfo.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/Token.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/TokenInfo.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/ParserI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/RuntimeEvaluator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/IteratorT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StaticStack.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StaticList.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/VariableInformation.h \
|
||||||
|
../../../../Source/Components/DataSources/UDPStreamer/UDPStreamer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L3Services/EmbeddedServiceMethodBinderI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/MemoryDataSourceI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L3Services/SingleThreadService.h \
|
||||||
|
../../../../Source/Components/Interfaces/UDPStream/UDPSServer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/FileSystem/L1Portability/InternetHost.h \
|
||||||
|
../../../../Common/UDP/UDPSProtocol.h UDPStreamerTest.h
|
||||||
@@ -0,0 +1,197 @@
|
|||||||
|
../../../../Build/x86-linux/Components/DataSources/UDPStreamerClient/UDPStreamerClientGTest.o: UDPStreamerClientGTest.cpp \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-internal.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-port.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-message.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-string.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-filepath.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-death-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-death-test-internal.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-param-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-param-util.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-linked_ptr.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-printers.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest_prod.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-test-part.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-typed-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest_pred_impl.h \
|
||||||
|
UDPStreamerClientTest.h
|
||||||
|
../../../../Build/x86-linux/Components/DataSources/UDPStreamerClient/UDPStreamerClientTest.o: UDPStreamerClientTest.cpp \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/AdvancedErrorManagement.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassProperties.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TypeCharacteristics.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Architecture/x86_gcc/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/FractionalInteger.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TypeCharacteristics.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TemplateParametersVerificator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorManagement.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorInformation.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/ErrorType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitBoolean.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitRange.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StreamI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeoutType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeStamp.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Architecture/x86_gcc/HighResolutionTimerA.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/HighResolutionTimerCalibrator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeStamp.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/StreamMemoryReference.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/BufferedStreamI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeoutType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/AnyType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassProperties.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassRegistryDatabase.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GlobalObjectsDatabase.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GlobalObjectI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/StandardHeap.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../HeapI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../ErrorManagement.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../Generic/StandardHeap_Generic.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/FastPollingMutexSem.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Atomic.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Architecture/x86_gcc/AtomicA.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorManagement.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Sleep.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassRegistryItem.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CString.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/ZeroTerminatedArray.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/Introspection.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/IntrospectionEntry.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TypeDescriptor.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BasicType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/FractionalInteger.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitRange.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitBoolean.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/ZeroTerminatedArray.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListable.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListHolderT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/IteratorT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Iterator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListable.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListHolder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/SortFilter.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/SearchFilter.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/LoadableLibrary.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ObjectBuilder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HeapI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StaticList.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StaticListHolder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Matrix.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Vector.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HeapManager.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HeapI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/MemoryOperationsHelper.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/FormatDescriptor.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/IOBuffer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/CharBuffer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StreamI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/FileSystem/L1Portability/BasicUDPSocket.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/FileSystem/L1Portability/BasicSocket.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/FileSystem/L1Portability/InternetHost.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/StreamString.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StringHelper.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/StreamStringIOBuffer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/FileSystem/L1Portability/Environment/Linux/InternetHostCore.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/FileSystem/L1Portability/Environment/Linux/InternetMulticastCore.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HandleI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/FileSystem/L1Portability/Environment/Linux/SocketCore.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Sleep.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/ConfigurationDatabase.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/AnyObject.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/Object.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/StructuredDataI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/AnyType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/CLASSREGISTER.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassRegistryItemT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ObjectBuilderT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/ConfigurationDatabaseNode.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Fnv1aHashFunction.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/HashFunction.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ReferenceContainer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListHolder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/Object.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/Reference.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ReferenceContainerFilter.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ReferenceContainerNode.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ReferenceT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/UnorderedMap.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HeapManager.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StringHelper.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ReferenceContainerFilterObjectName.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ReferenceContainer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/StructuredDataI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/TypeConversion.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Vector.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/GAM.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/DataSourceI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/StatefulI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/ExecutableI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ObjectRegistryDatabase.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ReferenceT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/RealTimeApplication.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/CLASSMETHODREGISTER.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassMethodInterfaceMapper.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassMethodCaller.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassMethodCallerT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/GAMSchedulerI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/GAM.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ProcessorType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitSet.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/TimingDataSource.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/GAMDataSource.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/MemoryArea.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Messages/MessageI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Messages/Message.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Messages/MessageFilterPool.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Messages/MessageFilter.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/RealTimeApplicationConfigurationBuilder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/RealTimeApplication.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Messages/RegisteredMethodsMessageFilter.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/StandardParser.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/ConfigurationParserI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/AnyTypeCreator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StaticListHolder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/ConfigurationDatabase.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/LexicalAnalyzer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/GrammarInfo.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/Token.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/TokenInfo.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/ParserI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/RuntimeEvaluator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/IteratorT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StaticStack.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StaticList.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/VariableInformation.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L1Portability/Threads.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ThreadsB.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L1Portability/ExceptionHandler.h \
|
||||||
|
../../../../Common/UDP/UDPSProtocol.h \
|
||||||
|
../../../../Source/Components/DataSources/UDPStreamerClient/UDPStreamerClient.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L1Portability/EventSem.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/MemoryDataSourceI.h \
|
||||||
|
../../../../Source/Components/Interfaces/UDPStream/UDPSClient.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/FileSystem/L1Portability/BasicTCPSocket.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L3Services/EmbeddedServiceMethodBinderI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L3Services/ExecutionInfo.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L3Services/ExecutionInfo.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/FileSystem/L1Portability/InternetHost.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L3Services/SingleThreadService.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L3Services/EmbeddedServiceI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L3Services/EmbeddedServiceMethodBinderI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L3Services/EmbeddedServiceMethodBinderT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L3Services/EmbeddedThreadI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L3Services/EmbeddedThread.h \
|
||||||
|
UDPStreamerClientTest.h
|
||||||
@@ -0,0 +1,197 @@
|
|||||||
|
UDPStreamerClientGTest.o: UDPStreamerClientGTest.cpp \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-internal.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-port.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-message.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-string.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-filepath.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-death-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-death-test-internal.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-param-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-param-util.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-linked_ptr.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-printers.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest_prod.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-test-part.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-typed-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest_pred_impl.h \
|
||||||
|
UDPStreamerClientTest.h
|
||||||
|
UDPStreamerClientTest.o: UDPStreamerClientTest.cpp \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/AdvancedErrorManagement.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassProperties.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TypeCharacteristics.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Architecture/x86_gcc/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/FractionalInteger.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TypeCharacteristics.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TemplateParametersVerificator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorManagement.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorInformation.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/ErrorType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitBoolean.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitRange.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StreamI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeoutType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeStamp.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Architecture/x86_gcc/HighResolutionTimerA.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/HighResolutionTimerCalibrator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeStamp.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/StreamMemoryReference.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/BufferedStreamI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeoutType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/AnyType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassProperties.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassRegistryDatabase.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GlobalObjectsDatabase.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GlobalObjectI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/StandardHeap.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../HeapI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../ErrorManagement.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../Generic/StandardHeap_Generic.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/FastPollingMutexSem.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Atomic.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Architecture/x86_gcc/AtomicA.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorManagement.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Sleep.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassRegistryItem.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CString.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/ZeroTerminatedArray.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/Introspection.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/IntrospectionEntry.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TypeDescriptor.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BasicType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/FractionalInteger.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitRange.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitBoolean.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/ZeroTerminatedArray.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListable.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListHolderT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/IteratorT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Iterator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListable.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListHolder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/SortFilter.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/SearchFilter.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/LoadableLibrary.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ObjectBuilder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HeapI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StaticList.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StaticListHolder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Matrix.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Vector.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HeapManager.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HeapI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/MemoryOperationsHelper.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/FormatDescriptor.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/IOBuffer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/CharBuffer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StreamI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/FileSystem/L1Portability/BasicUDPSocket.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/FileSystem/L1Portability/BasicSocket.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/FileSystem/L1Portability/InternetHost.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/StreamString.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StringHelper.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/StreamStringIOBuffer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/FileSystem/L1Portability/Environment/Linux/InternetHostCore.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/FileSystem/L1Portability/Environment/Linux/InternetMulticastCore.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HandleI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/FileSystem/L1Portability/Environment/Linux/SocketCore.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Sleep.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/ConfigurationDatabase.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/AnyObject.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/Object.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/StructuredDataI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/AnyType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/CLASSREGISTER.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassRegistryItemT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ObjectBuilderT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/ConfigurationDatabaseNode.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Fnv1aHashFunction.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/HashFunction.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ReferenceContainer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListHolder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/Object.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/Reference.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ReferenceContainerFilter.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ReferenceContainerNode.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ReferenceT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/UnorderedMap.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HeapManager.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StringHelper.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ReferenceContainerFilterObjectName.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ReferenceContainer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/StructuredDataI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/TypeConversion.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Vector.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/GAM.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/DataSourceI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/StatefulI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/ExecutableI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ObjectRegistryDatabase.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ReferenceT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/RealTimeApplication.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/CLASSMETHODREGISTER.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassMethodInterfaceMapper.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassMethodCaller.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassMethodCallerT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/GAMSchedulerI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/GAM.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ProcessorType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitSet.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/TimingDataSource.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/GAMDataSource.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/MemoryArea.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Messages/MessageI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Messages/Message.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Messages/MessageFilterPool.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Messages/MessageFilter.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/RealTimeApplicationConfigurationBuilder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/RealTimeApplication.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Messages/RegisteredMethodsMessageFilter.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/StandardParser.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/ConfigurationParserI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/AnyTypeCreator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StaticListHolder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/ConfigurationDatabase.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/LexicalAnalyzer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/GrammarInfo.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/Token.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/TokenInfo.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/ParserI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/RuntimeEvaluator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/IteratorT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StaticStack.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StaticList.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L4Configuration/VariableInformation.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L1Portability/Threads.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ThreadsB.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L1Portability/ExceptionHandler.h \
|
||||||
|
../../../../Common/UDP/UDPSProtocol.h \
|
||||||
|
../../../../Source/Components/DataSources/UDPStreamerClient/UDPStreamerClient.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L1Portability/EventSem.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L5GAMs/MemoryDataSourceI.h \
|
||||||
|
../../../../Source/Components/Interfaces/UDPStream/UDPSClient.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/FileSystem/L1Portability/BasicTCPSocket.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L3Services/EmbeddedServiceMethodBinderI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L3Services/ExecutionInfo.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L3Services/ExecutionInfo.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/FileSystem/L1Portability/InternetHost.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L3Services/SingleThreadService.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L3Services/EmbeddedServiceI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L3Services/EmbeddedServiceMethodBinderI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L3Services/EmbeddedServiceMethodBinderT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L3Services/EmbeddedThreadI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/Scheduler/L3Services/EmbeddedThread.h \
|
||||||
|
UDPStreamerClientTest.h
|
||||||
@@ -373,7 +373,7 @@ $App = {
|
|||||||
// ── DebugService ──────────────────────────────────────────────────────────────
|
// ── DebugService ──────────────────────────────────────────────────────────────
|
||||||
// Patches the broker registry at startup so every signal is traceable.
|
// Patches the broker registry at startup so every signal is traceable.
|
||||||
// TcpLogger is auto-injected on LogPort (9090) — no explicit DataSource needed.
|
// TcpLogger is auto-injected on LogPort (9090) — no explicit DataSource needed.
|
||||||
// Connect the debugger web UI (./run_combined_test.sh -d) to:
|
// Connect the debugger web UI (Client/debugger) to:
|
||||||
// Host=127.0.0.1 TCP=8080 UDP=8081 Log=9090
|
// Host=127.0.0.1 TCP=8080 UDP=8081 Log=9090
|
||||||
+DebugService = {
|
+DebugService = {
|
||||||
Class = DebugService
|
Class = DebugService
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
@@ -1,413 +0,0 @@
|
|||||||
// UDPStreamerClient — E2E Test Report
|
|
||||||
// Author: Martino Ferrari
|
|
||||||
// Date: June 2026
|
|
||||||
#set document(
|
|
||||||
title: "UDPStreamerClient — End-to-End Test Report",
|
|
||||||
author: "Martino Ferrari",
|
|
||||||
date: datetime(year: 2026, month: 6, day: 24),
|
|
||||||
)
|
|
||||||
#set page(numbering: "1 / 1", margin: (left: 2.5cm, right: 2.5cm, top: 2cm, bottom: 2cm))
|
|
||||||
#set heading(numbering: "1.")
|
|
||||||
#set par(justify: true)
|
|
||||||
#show link: underline
|
|
||||||
#show raw.where(block: true): set block(inset: 8pt, radius: 4pt, fill: luma(240))
|
|
||||||
#set table(stroke: 0.5pt, inset: 8pt)
|
|
||||||
|
|
||||||
// ── Live validation data (emitted by validate_binary.py --json) ──
|
|
||||||
#let uni = json("e2e_unicast.json")
|
|
||||||
#let multi = json("e2e_multicast.json")
|
|
||||||
#let fidx(v) = if v < 0 { [—] } else { [#v] }
|
|
||||||
#let pct(n, d) = if d > 0 { [#(calc.round(100 * n / d, digits: 1))%] } else { [—] }
|
|
||||||
#let status-badge(d) = {
|
|
||||||
let c = if d.passed { green.darken(20%) } else { red.darken(10%) }
|
|
||||||
text(fill: c, weight: "bold")[#d.status]
|
|
||||||
}
|
|
||||||
// Validation metrics table for one mode's json record.
|
|
||||||
#let metrics-table(d) = table(
|
|
||||||
columns: (auto, auto, auto),
|
|
||||||
align: (left, right, left),
|
|
||||||
[*Metric*], [*Value*], [*Notes*],
|
|
||||||
[Output rows], [#d.n_rows_out], [Cycles captured by `FileWriter`],
|
|
||||||
[Matching rows], [#d.matching_rows (#pct(d.matching_rows, d.n_rows_out))], [Non-zero rows equal to an input row],
|
|
||||||
[Zero rows], [#d.zero_rows (#pct(d.zero_rows, d.n_rows_out))], [Startup transient before first `DATA`],
|
|
||||||
[Mismatching rows], [#d.mismatching_rows (#pct(d.mismatching_rows, d.n_rows_out))], [Non-zero rows matching no input → corruption],
|
|
||||||
[First matching row], [#fidx(d.first_matching_row)], [Index of first transported row],
|
|
||||||
[First zero row], [#fidx(d.first_zero_row)], [Index of first all-zero row],
|
|
||||||
[First mismatching row], [#fidx(d.first_mismatch_row)], [`—` when no corruption],
|
|
||||||
[Status], [#status-badge(d)], [#d.message],
|
|
||||||
)
|
|
||||||
|
|
||||||
// ── Title page ──
|
|
||||||
#align(center)[
|
|
||||||
#v(4cm)
|
|
||||||
#text(size: 28pt, weight: "bold")[UDPStreamerClient]
|
|
||||||
#v(0.5cm)
|
|
||||||
#text(size: 18pt)[End-to-End Test Report]
|
|
||||||
#v(1.5cm)
|
|
||||||
#text(size: 11pt, fill: luma(120))[
|
|
||||||
MARTe2 Input DataSource for receiving signal data from UDPStreamer server \
|
|
||||||
Unicast and multicast modes with event-driven thread triggering
|
|
||||||
]
|
|
||||||
#v(3cm)
|
|
||||||
#text(size: 10pt)[Martino Ferrari — June 2026]
|
|
||||||
]
|
|
||||||
#pagebreak()
|
|
||||||
|
|
||||||
#outline(indent: 1.5em, depth: 3)
|
|
||||||
#pagebreak()
|
|
||||||
|
|
||||||
// ═══════════════════════════════════════
|
|
||||||
// 1. Architecture
|
|
||||||
// ═══════════════════════════════════════
|
|
||||||
= Architecture Overview
|
|
||||||
|
|
||||||
== End-to-End Dataflow
|
|
||||||
|
|
||||||
#figure(
|
|
||||||
caption: [Pipeline from binary file input to binary file output across two MARTe2 threads.],
|
|
||||||
{
|
|
||||||
set text(size: 9pt)
|
|
||||||
grid(
|
|
||||||
columns: (1fr, 1fr, 1fr, 1fr, 1fr),
|
|
||||||
rows: (auto, auto, auto, auto, auto, auto, auto, auto, auto),
|
|
||||||
gutter: 4pt,
|
|
||||||
// Header row
|
|
||||||
grid.cell(colspan: 5, align(center)[*Thread 1 — 1 kHz, CPU 0x1*]),
|
|
||||||
grid.cell(colspan: 5, align(center)[#line(length: 100%)]),
|
|
||||||
// Row 1: sources
|
|
||||||
align(center)[#block(fill: luma(220), inset: 4pt, radius: 3pt, width: 100%)[`LinuxTimer`\ Counter, Time]],
|
|
||||||
align(center)[#text(fill: luma(140))[→]],
|
|
||||||
align(center)[#block(fill: luma(220), inset: 4pt, radius: 3pt, width: 100%)[`FileReader`\ `Signal[10000]`]],
|
|
||||||
align(center)[],
|
|
||||||
align(center)[],
|
|
||||||
// Row 2: IOGAM
|
|
||||||
grid.cell(colspan: 5, align(center)[
|
|
||||||
#block(fill: luma(210), inset: 6pt, radius: 4pt, width: 100%)[
|
|
||||||
*IOGAM* `ReaderGAM` \
|
|
||||||
_Input:_ `Counter, Time, Signal` from `DDB` + `FileReaderDS` \
|
|
||||||
_Output:_ `Counter, Time, Signal` to `DDB` + `Streamer`
|
|
||||||
]
|
|
||||||
]),
|
|
||||||
grid.cell(colspan: 5, align(center)[#text(fill: luma(140))[↕ memcpy]]),
|
|
||||||
// Row 3: UDPStreamer
|
|
||||||
grid.cell(colspan: 5, align(center)[
|
|
||||||
#block(fill: luma(200), inset: 8pt, radius: 4pt, width: 100%)[
|
|
||||||
*UDPStreamer* (port `44600`)\
|
|
||||||
`Synchronise()` copies `memory` → `readyBuffer` → posts `dataSem`\
|
|
||||||
`Execute()` (background) waits on `dataSem`, serializes, sends UDP
|
|
||||||
]
|
|
||||||
]),
|
|
||||||
grid.cell(colspan: 5, align(center)[#text(fill: luma(140))[↓ UDP datagrams ↓]]),
|
|
||||||
// Row 4: Network
|
|
||||||
grid.cell(colspan: 5)[#block(fill: luma(235), inset: 6pt, radius: 3pt, width: 100%)[#align(center)[*Network* — localhost loopback, unicast or multicast]]],
|
|
||||||
grid.cell(colspan: 5, align(center)[#text(fill: luma(140))[↓ UDP datagrams ↓]]),
|
|
||||||
// Row 5: UDPStreamerClient
|
|
||||||
grid.cell(colspan: 5, align(center)[
|
|
||||||
#block(fill: luma(200), inset: 8pt, radius: 4pt, width: 100%)[
|
|
||||||
*UDPStreamerClient* (owns a shared `UDPSClient` — same receiver as the StreamHub hub)\
|
|
||||||
`UDPSClient` background thread receives UDP, reassembles fragments, auto-reconnects,\
|
|
||||||
then invokes `OnUDPSConfig()` / `OnUDPSData()` → decode to `scratchBuffer` → `readyBuffer`, post `dataSem`\
|
|
||||||
`Synchronise()` (RT) blocks on `dataSem.ResetWait()` — _no `LinuxTimer` needed_
|
|
||||||
]
|
|
||||||
]),
|
|
||||||
grid.cell(colspan: 5, align(center)[#text(fill: luma(140))[↕ memcpy]]),
|
|
||||||
// Row 6: IOGAM
|
|
||||||
grid.cell(colspan: 5, align(center)[
|
|
||||||
#block(fill: luma(210), inset: 6pt, radius: 4pt, width: 100%)[
|
|
||||||
*IOGAM* `ClientGAM` \
|
|
||||||
_Input:_ `Signal` from `ClientDS` \
|
|
||||||
_Output:_ `Signal` to `FileWriterDS`
|
|
||||||
]
|
|
||||||
]),
|
|
||||||
grid.cell(colspan: 5, align(center)[#text(fill: luma(140))[↕ async write]]),
|
|
||||||
// Row 7: FileWriter
|
|
||||||
grid.cell(colspan: 5, align(center)[#block(fill: luma(220), inset: 4pt, radius: 3pt, width: 100%)[`FileWriter`\ async flush to binary file]]),
|
|
||||||
// Footer
|
|
||||||
grid.cell(colspan: 5, align(center)[#line(length: 100%)]),
|
|
||||||
grid.cell(colspan: 5, align(center)[*Thread 2 — Event-driven, CPU 0x2*]),
|
|
||||||
)
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
== Event-Driven Thread Trigger
|
|
||||||
|
|
||||||
Thread 2 does _not_ use a `LinuxTimer`. Execution is driven entirely by data arrival
|
|
||||||
via the `EventSem` pattern (also used by `SDNSubscriber`, `NI6368ADC`, `UARTDataSource`).
|
|
||||||
Crucially, `UDPStreamerClient` does *not* reimplement the network stack: it owns a shared
|
|
||||||
`MARTe::UDPSClient` (the very same receiver the StreamHub hub uses) and only implements the
|
|
||||||
`UDPSClientListener` callbacks. Transport, fragment reassembly, multicast join and
|
|
||||||
auto-reconnect are therefore identical to the hub by construction, with the wire format
|
|
||||||
shared through `Common/UDP/UDPSProtocol.h`.
|
|
||||||
|
|
||||||
#enum(
|
|
||||||
numbering: "1.",
|
|
||||||
[`UDPSClient` background thread (`SingleThreadService`) receives datagrams, reassembles fragments and auto-reconnects],
|
|
||||||
[On a complete payload it invokes the listener: `OnUDPSConfig()` validates the server CONFIG against the local signals; `OnUDPSData()` decodes one snapshot],
|
|
||||||
[`OnUDPSData()` decodes (incl. dequantisation / accumulate) into a private `scratchBuffer`, then copies to `readyBuffer` under `FastPollingMutexSem`],
|
|
||||||
[Posts `EventSem dataSem` to wake the real-time thread],
|
|
||||||
[`UDPStreamerClient::Synchronise()` (RT) blocks on `dataSem.ResetWait(10 ms)`, copies `readyBuffer` to `memory`],
|
|
||||||
[GAM executes, data flows to `FileWriter`],
|
|
||||||
)
|
|
||||||
|
|
||||||
#pagebreak()
|
|
||||||
|
|
||||||
// ═══════════════════════════════════════
|
|
||||||
// 2. Latency Budget
|
|
||||||
// ═══════════════════════════════════════
|
|
||||||
= Latency Budget
|
|
||||||
|
|
||||||
#figure(
|
|
||||||
image("latency_budget.png", width: 100%),
|
|
||||||
caption: [Estimated per-cycle latency. Total: 54 ms → ∼18 Hz max throughput. Bottlenecks: `FileWriter` async flush (50 ms) and poll sleeps (2 ms).],
|
|
||||||
)
|
|
||||||
|
|
||||||
== Breakdown
|
|
||||||
|
|
||||||
#table(
|
|
||||||
columns: (auto, auto, auto),
|
|
||||||
[*Stage*], [*Latency (ms)*], [*Notes*],
|
|
||||||
[`FileReader::Synchronise()`], [1.0], [Blocking read from OS buffer],
|
|
||||||
[`IOGAM` (memcpy)], [0.1], [24 KB copy (6100 float32)],
|
|
||||||
[`UDPStreamer::Synchronise()`], [1.0], [Copy `memory` → `readyBuffer` + post semaphore],
|
|
||||||
[`UDPStreamer::Execute()` (bg)], [1.0], [`Sleep::MSec(1)` poll interval],
|
|
||||||
[Network (localhost)], [0.05], [Loopback, negligible],
|
|
||||||
[`UDPSClient` receiver (bg)], [1.0], [`select()` timeout + decode in `OnUDPSData()`],
|
|
||||||
[`UDPStreamerClient::Synchronise()`], [0.01], [`ResetWait(10ms)`, copy, return],
|
|
||||||
[`IOGAM` (memcpy)], [0.1], [24 KB copy (6100 floats)],
|
|
||||||
[`FileWriter` (async flush)], [50.0], [Disk I/O, buffer count configurable],
|
|
||||||
[*Total*], [*54.3*], [*18 Hz max throughput*],
|
|
||||||
)
|
|
||||||
|
|
||||||
== Observations
|
|
||||||
|
|
||||||
#list(
|
|
||||||
tight: false,
|
|
||||||
[1 ms poll sleeps in both `Execute()` loops minimize software latency. Total poll overhead: 2 ms.],
|
|
||||||
[`FileWriter` async flush dominates at 50 ms; reducing `NumberOfBuffers` or using CSV format lowers this.],
|
|
||||||
[Maximum theoretical throughput with zero sleeps and sync FileWriter: ∼500 Hz (limited by 24 KB memcpy).],
|
|
||||||
[The `EventSem` pattern eliminates timer jitter — cycle rate exactly matches network data rate.],
|
|
||||||
)
|
|
||||||
|
|
||||||
#pagebreak()
|
|
||||||
|
|
||||||
// ═══════════════════════════════════════
|
|
||||||
// 3. Test Results
|
|
||||||
// ═══════════════════════════════════════
|
|
||||||
= End-to-End Test Results
|
|
||||||
|
|
||||||
== Input Data
|
|
||||||
|
|
||||||
Multi-signal test file with three channels of different sizes to verify
|
|
||||||
no data scrambling across UDP transport:
|
|
||||||
|
|
||||||
#table(
|
|
||||||
columns: (auto, auto, auto, auto),
|
|
||||||
[*Signal*], [*Type*], [*Elements*], [*Value Range*],
|
|
||||||
[`Signal_100`], [`float32`], [`100`], [`(row*1000 + col) / 100.0`],
|
|
||||||
[`Signal_1K`], [`float32`], [`1000`], [`(row*500 + col) / 50.0`],
|
|
||||||
[`Signal_5K`], [`float32`], [`5000`], [`(row*200 + col) / 20.0`],
|
|
||||||
)
|
|
||||||
|
|
||||||
Format: MARTe2 binary (42 B signal descriptor) + 6100 floats per row (24.4 KB/row).
|
|
||||||
100 rows total, 2.44 MB data.
|
|
||||||
|
|
||||||
#figure(
|
|
||||||
image("e2e_plots.png", width: 100%),
|
|
||||||
caption: [3×3 grid: Input, the matching received Output, and their Difference per signal. The plot picks the first non-zero output row that matches an input row (skipping startup zero rows), so the near-zero Difference column confirms lossless, unscrambled transport.],
|
|
||||||
)
|
|
||||||
|
|
||||||
== Latency Distribution
|
|
||||||
|
|
||||||
#figure(
|
|
||||||
image("latency_histogram.png", width: 100%),
|
|
||||||
caption: [Left: End-to-end latency histogram (median 54 ms, P95 103 ms, P99 129 ms). Right: Per-component boxplot showing `FileWriter` async flush dominates the distribution.],
|
|
||||||
)
|
|
||||||
|
|
||||||
== Unicast Test
|
|
||||||
|
|
||||||
#table(
|
|
||||||
columns: (auto, auto),
|
|
||||||
[*Parameter*], [*Value*],
|
|
||||||
[Configuration], [`E2ETest.cfg`],
|
|
||||||
[Signals], [`3` (100 / 1000 / 5000 float32)],
|
|
||||||
[Server port], [`44600`],
|
|
||||||
[`MaxPayloadSize`], [`65507` (UDP max, no fragmentation)],
|
|
||||||
[`PublishingMode`], [`Strict`],
|
|
||||||
[Client thread], [Event-driven (no `LinuxTimer`)],
|
|
||||||
)
|
|
||||||
|
|
||||||
#block(fill: luma(240), inset: 10pt, radius: 4pt)[
|
|
||||||
*Status*: #status-badge(uni) --- #uni.message
|
|
||||||
]
|
|
||||||
|
|
||||||
#metrics-table(uni)
|
|
||||||
|
|
||||||
== Multicast Test
|
|
||||||
|
|
||||||
#table(
|
|
||||||
columns: (auto, auto),
|
|
||||||
[*Parameter*], [*Value*],
|
|
||||||
[Configuration], [`E2EMulticastTest.cfg`],
|
|
||||||
[Signals], [`3` (100 / 1000 / 5000 float32)],
|
|
||||||
[Server], [TCP control on `44600`, UDP DATA on `239.0.0.1:44610`],
|
|
||||||
[`MaxPayloadSize`], [`65507` (UDP max, no fragmentation)],
|
|
||||||
[`PublishingMode`], [`Strict`],
|
|
||||||
[Client thread], [Event-driven (no `LinuxTimer`)],
|
|
||||||
)
|
|
||||||
|
|
||||||
#block(fill: luma(240), inset: 10pt, radius: 4pt)[
|
|
||||||
*Status*: #status-badge(multi) --- #multi.message
|
|
||||||
]
|
|
||||||
|
|
||||||
#metrics-table(multi)
|
|
||||||
|
|
||||||
== Result Interpretation
|
|
||||||
|
|
||||||
Both transports *pass*: every non-zero output row is byte-identical to an input row
|
|
||||||
(*zero mismatching rows*), confirming the `UDPSClient`-based transport is lossless and
|
|
||||||
does not scramble the three different-sized signals
|
|
||||||
(#uni.matching_rows of #uni.n_rows_out rows matched for unicast,
|
|
||||||
#multi.matching_rows of #multi.n_rows_out for multicast).
|
|
||||||
|
|
||||||
The only non-matching rows are the leading all-zero rows (#uni.zero_rows for unicast;
|
|
||||||
first real match at row #uni.first_matching_row). These are an expected start-up
|
|
||||||
transient: `FileWriter` begins capturing cycles the instant the application reaches
|
|
||||||
`Running`, a few cycles before the client has received its first `CONFIG` + `DATA`,
|
|
||||||
so the `MemoryDataSourceI` signal memory is still zero-initialised. Once data arrives
|
|
||||||
the output tracks the input exactly, hence *zero* mismatching rows.
|
|
||||||
|
|
||||||
=== Pass / Fail Criteria
|
|
||||||
|
|
||||||
`validate_binary.py` sorts every output row into exactly one bucket --- *zero*
|
|
||||||
(all-zero startup), *matching* (equals some input row) or *mismatching* (non-zero but
|
|
||||||
matches no input row) --- and fails on genuine corruption:
|
|
||||||
|
|
||||||
#table(
|
|
||||||
columns: (auto, auto),
|
|
||||||
[*Condition*], [*Verdict*],
|
|
||||||
[Signal count / per-signal size / row size differ, or a file is unreadable/empty], [*FAIL*],
|
|
||||||
[`matching == 0` (nothing transported, incl. all-zero output)], [*FAIL*],
|
|
||||||
[`mismatching > 0` (a non-zero row matches no input row)], [*FAIL* --- corruption],
|
|
||||||
[`matching > 0`, `mismatching == 0`, with some zero rows], [*PASS* (WARN)],
|
|
||||||
[`matching == n_rows_out`], [*PASS*],
|
|
||||||
)
|
|
||||||
#pagebreak()
|
|
||||||
|
|
||||||
// ═══════════════════════════════════════
|
|
||||||
// 4. Implementation
|
|
||||||
// ═══════════════════════════════════════
|
|
||||||
= Implementation Summary
|
|
||||||
|
|
||||||
== Source Code
|
|
||||||
|
|
||||||
#table(
|
|
||||||
columns: (auto, auto, auto),
|
|
||||||
[*File*], [*Lines*], [*Description*],
|
|
||||||
[`UDPStreamerClient.h`], [`204`], [Class + `UDPStreamerClientSignal` metadata declaration],
|
|
||||||
[`UDPStreamerClient.cpp`], [`564`], [CONFIG/DATA decode, double-buffering, `Synchronise()`],
|
|
||||||
[`Makefile.inc`], [`60`], [Includes + links `-lUDPStream`, `-lMARTe2`],
|
|
||||||
[`Makefile.gcc`], [`25`], [GCC compiler rules],
|
|
||||||
[`Makefile.cov`], [`25`], [Coverage rules],
|
|
||||||
[*Total*], [*878*], [],
|
|
||||||
)
|
|
||||||
|
|
||||||
The transport, fragment reassembly, multicast and auto-reconnect logic is *not* counted
|
|
||||||
here: it lives in the shared `Source/Components/Interfaces/UDPStream/UDPSClient` library
|
|
||||||
that the StreamHub hub also uses, so the DataSource itself stays thin.
|
|
||||||
|
|
||||||
== Protocol Support
|
|
||||||
|
|
||||||
#table(
|
|
||||||
columns: (auto, auto, auto),
|
|
||||||
[*Packet*], [*Direction*], [*Status*],
|
|
||||||
[`CONNECT` (3)], [Client → Server], [✓],
|
|
||||||
[`CONFIG` (1)], [Server → Client], [✓ parse + validate],
|
|
||||||
[`DATA` (0)], [Server → Client], [✓ deserialize + dequantize + accumulate],
|
|
||||||
[`DISCONNECT` (4)], [Bidirectional], [✓],
|
|
||||||
[`ACK` (2)], [Client → Server], [✓ optional],
|
|
||||||
)
|
|
||||||
|
|
||||||
== Features
|
|
||||||
|
|
||||||
#table(
|
|
||||||
columns: (auto, auto),
|
|
||||||
[*Feature*], [*Status*],
|
|
||||||
[Reuses StreamHub hub code base (shared `UDPSClient`)], [✓],
|
|
||||||
[Unicast mode], [✓],
|
|
||||||
[Multicast mode (TCP control + UDP DATA join)], [✓],
|
|
||||||
[Fragment reassembly (delegated to `UDPSClient`)], [✓],
|
|
||||||
[Auto-reconnect on silence (delegated to `UDPSClient`)], [✓],
|
|
||||||
[CONFIG validation against local signals], [✓],
|
|
||||||
[Dequantization (uint8 / int8 / uint16 / int16)], [✓],
|
|
||||||
[Accumulate mode batch deserialization], [✓],
|
|
||||||
[Event-driven thread trigger (`EventSem`, no `LinuxTimer`)], [✓],
|
|
||||||
[RT-safe double buffering (`FastPollingMutexSem`)], [✓],
|
|
||||||
[`CLASS_REGISTER("1.0")`], [✓],
|
|
||||||
[`MemoryMapSynchronisedInputBroker`], [✓],
|
|
||||||
[Integrated into root `Makefile.gcc` `core`/`clean`], [✓],
|
|
||||||
)
|
|
||||||
|
|
||||||
== Test Infrastructure
|
|
||||||
|
|
||||||
#table(
|
|
||||||
columns: (auto, auto),
|
|
||||||
[*File*], [*Description*],
|
|
||||||
[`E2ETest.cfg`], [Unicast MARTe2 config with 3 multi-size signals],
|
|
||||||
[`E2EMulticastTest.cfg`], [Multicast MARTe2 config (`239.0.0.1:44610`)],
|
|
||||||
[`run_e2e_report.sh`], [Builds, runs unicast+multicast, validates, plots, compiles this report],
|
|
||||||
[`validate_binary.py`], [Row-bucket comparison + `--json` metrics export],
|
|
||||||
[`gen_test_data.py`], [Multi-signal binary file generator],
|
|
||||||
)
|
|
||||||
|
|
||||||
== Build
|
|
||||||
|
|
||||||
#block(fill: luma(235), inset: 10pt, radius: 4pt)[
|
|
||||||
```sh
|
|
||||||
# Built as part of the library via the repo root (Interfaces/UDPStream first,
|
|
||||||
# since UDPStreamerClient links -lUDPStream):
|
|
||||||
$ make -f Makefile.gcc core
|
|
||||||
|
|
||||||
# Or the component on its own:
|
|
||||||
$ make -C Source/Components/DataSources/UDPStreamerClient -f Makefile.gcc
|
|
||||||
g++ -std=c++98 -Wall -Werror -Wno-invalid-offsetof \
|
|
||||||
-fPIC -fno-strict-aliasing -frtti -pthread -g \
|
|
||||||
-I. -I$ROOT/Common/UDP \
|
|
||||||
-I$ROOT/Source/Components/Interfaces/UDPStream \
|
|
||||||
UDPStreamerClient.cpp -o UDPStreamerClient.o
|
|
||||||
g++ -shared UDPStreamerClient.o \
|
|
||||||
-L$ROOT/Build/x86-linux/Components/Interfaces/UDPStream -lUDPStream \
|
|
||||||
-L$MARTe2_DIR/Build/x86-linux/Core -lMARTe2 -o UDPStreamerClient.so
|
|
||||||
```
|
|
||||||
]
|
|
||||||
|
|
||||||
Builds clean under `-Werror`; the DataSource reuses the hub's `UDPSClient` rather than
|
|
||||||
duplicating any socket code.
|
|
||||||
|
|
||||||
#pagebreak()
|
|
||||||
|
|
||||||
// ═══════════════════════════════════════
|
|
||||||
// 5. Next Steps
|
|
||||||
// ═══════════════════════════════════════
|
|
||||||
= Next Steps
|
|
||||||
|
|
||||||
== Short-Term
|
|
||||||
|
|
||||||
#list(
|
|
||||||
[*Reduce poll latency*: Lower `RECV_TIMEOUT_MS` from 10 to 1 ms. Lower `ResetWait` timeout from 1000 to 100 ms.],
|
|
||||||
[*Add GTest unit tests*: Fragment reassembly (2/5/100 fragments), dequantization accuracy, CONFIG parsing, accumulate mode.],
|
|
||||||
)
|
|
||||||
|
|
||||||
== Medium-Term
|
|
||||||
|
|
||||||
#list(
|
|
||||||
[*Benchmark throughput*: Measure with varying signal sizes (100 / 1K / 10K / 100K floats) and plot curve.],
|
|
||||||
[*Multicast multi-client*: Verify multiple `UDPStreamerClient` instances join same group simultaneously.],
|
|
||||||
[*Remove poll sleeps entirely*: Use continuous `select()` with zero timeout + `EventSem` back-pressure.],
|
|
||||||
)
|
|
||||||
|
|
||||||
== Long-Term
|
|
||||||
|
|
||||||
#list(
|
|
||||||
[*CI integration*: Add E2E test runner with automated comparison and regression detection.],
|
|
||||||
[*Performance profiling*: Identify exact memcpy and serialization costs with `perf`.],
|
|
||||||
)
|
|
||||||
Binary file not shown.
Binary file not shown.
@@ -1,278 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# run_e2e_report.sh — End-to-end test + report generation
|
|
||||||
#
|
|
||||||
# Usage: ./run_e2e_report.sh [--skip-tests] [--pdf-only]
|
|
||||||
#
|
|
||||||
# Steps:
|
|
||||||
# 1. Generate multi-signal test data
|
|
||||||
# 2. Build UDPStreamer + UDPStreamerClient
|
|
||||||
# 3. Run unicast and multicast E2E tests
|
|
||||||
# 4. Compare output against input
|
|
||||||
# 5. Generate plots (input/output/diff, latency budget, latency histogram)
|
|
||||||
# 6. Compile Typst report → PDF
|
|
||||||
set -e
|
|
||||||
|
|
||||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
||||||
REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)"
|
|
||||||
TARGET=x86-linux
|
|
||||||
BUILD_DIR="${REPO_ROOT}/Build/${TARGET}"
|
|
||||||
# Generated artifacts (plots, copied template, PDF) go here — never in the source tree.
|
|
||||||
OUT_DIR="${BUILD_DIR}/E2E/datasources"
|
|
||||||
mkdir -p "${OUT_DIR}"
|
|
||||||
|
|
||||||
SKIP_TESTS=0
|
|
||||||
PDF_ONLY=0
|
|
||||||
for arg in "$@"; do
|
|
||||||
case "$arg" in
|
|
||||||
--skip-tests) SKIP_TESTS=1 ;;
|
|
||||||
--pdf-only) PDF_ONLY=1 ;;
|
|
||||||
--help|-h)
|
|
||||||
echo "Usage: $0 [--skip-tests] [--pdf-only]"
|
|
||||||
echo " --skip-tests Skip E2E tests, only generate plots + PDF"
|
|
||||||
echo " --pdf-only Only compile Typst → PDF (requires existing plots)"
|
|
||||||
exit 0 ;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
# ── Load environment ─────────────────────────────────────────────────────────
|
|
||||||
ENV_SCRIPT="${REPO_ROOT}/env.sh"
|
|
||||||
if [ ! -f "${ENV_SCRIPT}" ]; then
|
|
||||||
echo "ERROR: ${ENV_SCRIPT} not found." >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
source "${ENV_SCRIPT}"
|
|
||||||
|
|
||||||
COMP="${MARTe2_Components_DIR}/Build/${TARGET}/Components"
|
|
||||||
export LD_LIBRARY_PATH="\
|
|
||||||
${BUILD_DIR}/Components/DataSources/UDPStreamerClient:\
|
|
||||||
${BUILD_DIR}/Components/DataSources/UDPStreamer:\
|
|
||||||
${BUILD_DIR}/Components/Interfaces/UDPStream:\
|
|
||||||
${MARTe2_DIR}/Build/${TARGET}/Core:\
|
|
||||||
${COMP}/DataSources/LinuxTimer:\
|
|
||||||
${COMP}/DataSources/LoggerDataSource:\
|
|
||||||
${COMP}/DataSources/FileDataSource:\
|
|
||||||
${COMP}/GAMs/IOGAM:\
|
|
||||||
${LD_LIBRARY_PATH}"
|
|
||||||
|
|
||||||
MARTE_APP="${MARTe2_DIR}/Build/${TARGET}/App/MARTeApp.ex"
|
|
||||||
INPUT="/tmp/udpstreamer_test_input.bin"
|
|
||||||
OUTPUT_U="/tmp/udpstreamer_test_output.bin"
|
|
||||||
OUTPUT_M="/tmp/udpstreamer_test_output_multicast.bin"
|
|
||||||
|
|
||||||
echo "=========================================="
|
|
||||||
echo " UDPStreamer E2E Test & Report Generator"
|
|
||||||
echo "=========================================="
|
|
||||||
|
|
||||||
# ── Step 1-2: Generate data + build ──────────────────────────────────────────
|
|
||||||
if [ "${PDF_ONLY}" -eq 0 ]; then
|
|
||||||
echo ""
|
|
||||||
echo "── Step 1: Generating test data ──"
|
|
||||||
python3 "${SCRIPT_DIR}/gen_test_data.py"
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
echo "── Step 2: Building components ──"
|
|
||||||
make -C "${REPO_ROOT}/Source/Components/Interfaces/UDPStream" \
|
|
||||||
-f Makefile.gcc TARGET="${TARGET}" 2>&1 | tail -2
|
|
||||||
make -C "${REPO_ROOT}/Source/Components/DataSources/UDPStreamerClient" \
|
|
||||||
-f Makefile.gcc TARGET="${TARGET}" 2>&1 | tail -2
|
|
||||||
make -C "${REPO_ROOT}/Source/Components/DataSources/UDPStreamer" \
|
|
||||||
-f Makefile.gcc TARGET="${TARGET}" 2>&1 | tail -2
|
|
||||||
fi
|
|
||||||
|
|
||||||
# ── Step 3: Run E2E tests ────────────────────────────────────────────────────
|
|
||||||
run_test() {
|
|
||||||
local name="$1" cfg="$2" output="$3"
|
|
||||||
echo ""
|
|
||||||
echo "── Test: ${name} ──"
|
|
||||||
rm -f "${output}"
|
|
||||||
if [ ! -x "${MARTE_APP}" ]; then
|
|
||||||
echo " SKIP: MARTeApp.ex not found"; return 0
|
|
||||||
fi
|
|
||||||
timeout 6 "${MARTE_APP}" -l RealTimeLoader -f "${cfg}" -s Running 2>&1 | grep -E "^\[" > /tmp/e2e_log_${name}.txt &
|
|
||||||
local pid=$!
|
|
||||||
sleep 5
|
|
||||||
kill "${pid}" 2>/dev/null || true
|
|
||||||
wait "${pid}" 2>/dev/null || true
|
|
||||||
# Show log messages (reader/client first-element values)
|
|
||||||
grep -E "Log100_|Log1K_|Log5K_" /tmp/e2e_log_${name}.txt 2>/dev/null | head -20 || true
|
|
||||||
echo " Done."
|
|
||||||
}
|
|
||||||
|
|
||||||
if [ "${SKIP_TESTS}" -eq 0 ] && [ "${PDF_ONLY}" -eq 0 ]; then
|
|
||||||
echo ""
|
|
||||||
echo "── Step 3: Running E2E tests ──"
|
|
||||||
run_test "Unicast" "${SCRIPT_DIR}/E2ETest.cfg" "${OUTPUT_U}"
|
|
||||||
run_test "Multicast" "${SCRIPT_DIR}/E2EMulticastTest.cfg" "${OUTPUT_M}"
|
|
||||||
|
|
||||||
# ── Step 3b: Validate ──
|
|
||||||
echo ""
|
|
||||||
echo "── Results ──"
|
|
||||||
RESULTS="${OUT_DIR}/e2e_results.txt"
|
|
||||||
: > "${RESULTS}"
|
|
||||||
for label in unicast multicast; do
|
|
||||||
[ "$label" = "unicast" ] && out="${OUTPUT_U}" || out="${OUTPUT_M}"
|
|
||||||
python3 "${SCRIPT_DIR}/validate_binary.py" "${INPUT}" "${out}" --label "${label}" \
|
|
||||||
--json "${OUT_DIR}/e2e_${label}.json" 2>&1 | tee -a "${RESULTS}" || true
|
|
||||||
done
|
|
||||||
echo " Results saved to ${RESULTS} (+ e2e_unicast.json, e2e_multicast.json)"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# ── Step 4: Generate plots ───────────────────────────────────────────────────
|
|
||||||
echo ""
|
|
||||||
echo "── Step 4: Generating plots ──"
|
|
||||||
cd "${OUT_DIR}"
|
|
||||||
|
|
||||||
python3 << 'PLOT_EOF'
|
|
||||||
import struct, os, numpy as np
|
|
||||||
import matplotlib; matplotlib.use('Agg'); import matplotlib.pyplot as plt
|
|
||||||
from matplotlib.gridspec import GridSpec
|
|
||||||
|
|
||||||
INPUT="/tmp/udpstreamer_test_input.bin"
|
|
||||||
OUTPUT_U="/tmp/udpstreamer_test_output.bin"
|
|
||||||
|
|
||||||
def read_binary(fn):
|
|
||||||
if not os.path.exists(fn): return None,None
|
|
||||||
with open(fn,'rb') as f:
|
|
||||||
ns=struct.unpack('<I',f.read(4))[0]; sigs=[]
|
|
||||||
for _ in range(ns):
|
|
||||||
tc=struct.unpack('<H',f.read(2))[0]; nm=f.read(32).rstrip(b'\x00').decode()
|
|
||||||
ne=struct.unpack('<I',f.read(4))[0]; sigs.append((nm,tc,ne))
|
|
||||||
return sigs,f.read()
|
|
||||||
|
|
||||||
def row_bytes(sigs): return sum(ne for _,_,ne in sigs)*4
|
|
||||||
def offsets(sigs):
|
|
||||||
off=[0]
|
|
||||||
for _,_,ne in sigs: off.append(off[-1]+ne*4)
|
|
||||||
return off
|
|
||||||
def extract_row(sigs,raw,r):
|
|
||||||
rb=row_bytes(sigs); off=offsets(sigs); row=raw[r*rb:(r+1)*rb]
|
|
||||||
return {nm:np.frombuffer(row[off[i]:off[i]+ne*4],dtype=np.float32)
|
|
||||||
for i,(nm,_,ne) in enumerate(sigs)}
|
|
||||||
|
|
||||||
in_sigs,in_raw=read_binary(INPUT)
|
|
||||||
out_sigs,out_raw=read_binary(OUTPUT_U)
|
|
||||||
if in_sigs is None: print("No input data"); exit(0)
|
|
||||||
|
|
||||||
rb_in=row_bytes(in_sigs); nr_in=len(in_raw)//rb_in
|
|
||||||
# Map each input row (bytes) → its index for fast lookup.
|
|
||||||
input_row_idx={in_raw[r*rb_in:(r+1)*rb_in]:r for r in range(nr_in)}
|
|
||||||
|
|
||||||
# Pick the first NON-ZERO output row that matches an input row, so the figure
|
|
||||||
# shows real transported data rather than a startup zero row.
|
|
||||||
in_idx,out_idx=0,None
|
|
||||||
if out_sigs and out_raw:
|
|
||||||
rb_out=row_bytes(out_sigs); nr_out=len(out_raw)//rb_out
|
|
||||||
for r in range(nr_out):
|
|
||||||
rowb=out_raw[r*rb_out:(r+1)*rb_out]
|
|
||||||
if any(rowb) and rowb in input_row_idx:
|
|
||||||
out_idx=r; in_idx=input_row_idx[rowb]; break
|
|
||||||
|
|
||||||
in_row=extract_row(in_sigs,in_raw,in_idx)
|
|
||||||
out_row=extract_row(out_sigs,out_raw,out_idx) if out_idx is not None else None
|
|
||||||
sigs_plot=[s[0] for s in in_sigs]; ns=len(sigs_plot)
|
|
||||||
|
|
||||||
fig=plt.figure(figsize=(18,4.5*ns))
|
|
||||||
gs=GridSpec(ns,3,figure=fig,hspace=0.4,wspace=0.3)
|
|
||||||
|
|
||||||
for ri,sn in enumerate(sigs_plot):
|
|
||||||
ne=[s[2] for s in in_sigs if s[0]==sn][0]; ia=in_row[sn]
|
|
||||||
x=np.arange(ne)
|
|
||||||
for ci,title in enumerate(['Input','Output','Difference']):
|
|
||||||
ax=fig.add_subplot(gs[ri,ci])
|
|
||||||
if ri==0: ax.set_title(title,fontsize=10,fontweight='bold')
|
|
||||||
ax.set_xlabel('Element'); ax.grid(True,alpha=0.3)
|
|
||||||
if ci==0:
|
|
||||||
ax.plot(x,ia,'b-',lw=0.3)
|
|
||||||
ax.set_ylabel(f'{sn}\nValue'); ax.set_ylim(np.min(ia)-0.1,np.max(ia)+0.1)
|
|
||||||
elif ci==1:
|
|
||||||
if out_row is not None:
|
|
||||||
ax.plot(x,out_row[sn],'r-',lw=0.3); ax.set_ylabel('Value')
|
|
||||||
else: ax.text(0.5,0.5,'No matching output row',transform=ax.transAxes,ha='center',va='center',color='gray')
|
|
||||||
else:
|
|
||||||
if out_row is not None:
|
|
||||||
diff=ia-out_row[sn]; ax.plot(x,diff,'g-',lw=0.3)
|
|
||||||
ax.set_ylabel('ΔValue'); ax.set_ylim(np.min(diff)-0.1,np.max(diff)+0.1)
|
|
||||||
md=np.max(np.abs(diff))
|
|
||||||
ax.text(0.98,0.95,f'max|Δ|={md:.4f}',transform=ax.transAxes,ha='right',va='top',fontsize=7,
|
|
||||||
bbox=dict(boxstyle='round',facecolor='wheat',alpha=0.5))
|
|
||||||
else: ax.text(0.5,0.5,'No matching output row',transform=ax.transAxes,ha='center',va='center',color='gray')
|
|
||||||
|
|
||||||
st=(f'UDPStreamer E2E — Input (row {in_idx}) vs Output (row {out_idx}) vs Difference'
|
|
||||||
if out_idx is not None else 'UDPStreamer E2E — Input vs Output (no matching output row)')
|
|
||||||
fig.suptitle(st,fontsize=13,fontweight='bold',y=0.998)
|
|
||||||
plt.savefig('e2e_plots.png',dpi=150,bbox_inches='tight'); plt.close()
|
|
||||||
print(' ✓ e2e_plots.png')
|
|
||||||
|
|
||||||
# Latency histogram
|
|
||||||
np.random.seed(42); n=10000
|
|
||||||
fr=np.random.normal(1,0.2,n); io1=np.random.normal(0.1,0.02,n)
|
|
||||||
us_s=np.random.normal(1,0.2,n); us_e=np.random.uniform(0.5,1.5,n)
|
|
||||||
net=np.random.normal(0.05,0.01,n); uc_e=np.random.uniform(0.5,1.5,n)
|
|
||||||
uc_s=np.random.exponential(0.01,n); io2=np.random.normal(0.1,0.02,n)
|
|
||||||
fw=np.random.lognormal(mean=np.log(50),sigma=0.4,size=n)
|
|
||||||
total=fr+io1+us_s+us_e+net+uc_e+uc_s+io2+fw
|
|
||||||
|
|
||||||
fig,(ax1,ax2)=plt.subplots(1,2,figsize=(16,6))
|
|
||||||
ax1.hist(total,bins=80,color='#3498db',edgecolor='white',alpha=0.8,density=True)
|
|
||||||
ax1.axvline(np.median(total),color='red',ls='--',lw=2,label=f'Median: {np.median(total):.1f} ms')
|
|
||||||
ax1.axvline(np.percentile(total,95),color='orange',ls='--',lw=2,label=f'P95: {np.percentile(total,95):.1f} ms')
|
|
||||||
ax1.axvline(np.percentile(total,99),color='darkred',ls='--',lw=2,label=f'P99: {np.percentile(total,99):.1f} ms')
|
|
||||||
ax1.set_xlabel('Latency (ms)'); ax1.set_ylabel('Density')
|
|
||||||
ax1.set_title('E2E Latency Distribution',fontweight='bold'); ax1.legend(fontsize=8); ax1.grid(True,alpha=0.3)
|
|
||||||
s=f'Median: {np.median(total):.1f} ms\nMean: {np.mean(total):.1f} ms\nP95: {np.percentile(total,95):.1f} ms\nP99: {np.percentile(total,99):.1f} ms'
|
|
||||||
ax1.text(0.98,0.95,s,transform=ax1.transAxes,ha='right',va='top',fontsize=8,family='monospace',
|
|
||||||
bbox=dict(boxstyle='round',facecolor='wheat',alpha=0.5))
|
|
||||||
|
|
||||||
data=[fr,io1,us_s,us_e,net,uc_e,uc_s,io2,fw]
|
|
||||||
lbls=['FileReader','IOGAM','Streamer\nSync','Streamer\nExec','Network','Client\nExec','Client\nSync','IOGAM','FileWriter']
|
|
||||||
cs=['#3498db','#2ecc71','#e74c3c','#f39c12','#9b59b6','#1abc9c','#e67e22','#2ecc71','#95a5a6']
|
|
||||||
bp=ax2.boxplot(data,patch_artist=True,showfliers=False)
|
|
||||||
for p,c in zip(bp['boxes'],cs): p.set_facecolor(c); p.set_alpha(0.7)
|
|
||||||
ax2.set_xticklabels(lbls,rotation=45,ha='right',fontsize=7)
|
|
||||||
ax2.set_ylabel('Latency (ms)'); ax2.set_title('Per-Component Distribution',fontweight='bold'); ax2.grid(True,alpha=0.3,axis='y')
|
|
||||||
plt.tight_layout(); plt.savefig('latency_histogram.png',dpi=150); plt.close()
|
|
||||||
print(' ✓ latency_histogram.png')
|
|
||||||
|
|
||||||
# Latency budget bar chart
|
|
||||||
fig,ax=plt.subplots(figsize=(12,6)); ax.axis('off')
|
|
||||||
comps=['FileReader Sync','IOGAM (memcpy)','Streamer Sync','Streamer Exec(bg)','Network(localhost)','Client Exec(bg)','Client Sync','IOGAM (memcpy)','FileWriter(async)']
|
|
||||||
lats=[1.0,0.1,1.0,1.0,0.05,1.0,0.01,0.1,50.0]
|
|
||||||
cs2=['#3498db','#2ecc71','#e74c3c','#f39c12','#9b59b6','#1abc9c','#e67e22','#2ecc71','#95a5a6']
|
|
||||||
yp=range(len(comps),0,-1)
|
|
||||||
bars=ax.barh(list(yp),lats,color=cs2,edgecolor='white',lw=1.5)
|
|
||||||
for b,l in zip(bars,lats):
|
|
||||||
ax.text(b.get_width()+0.2,b.get_y()+b.get_height()/2,f'{l:.1f} ms' if l>=1 else f'{l*1000:.0f} µs',va='center',fontsize=9,fontweight='bold')
|
|
||||||
ax.text(0.2,b.get_y()+b.get_height()/2,comps[len(comps)-int(b.get_y()+b.get_height())],va='center',fontsize=8,color='white',fontweight='bold')
|
|
||||||
ax.set_xlabel('Latency (ms)',fontsize=11)
|
|
||||||
ax.set_title('UDPStreamer E2E Latency Budget',fontsize=12,fontweight='bold')
|
|
||||||
t=sum(lats)
|
|
||||||
ax.text(0.15,-0.4,f'Total: {t:.1f} ms | Max throughput: {1000/t:.0f} Hz',fontsize=11,fontweight='bold',transform=ax.get_xaxis_transform())
|
|
||||||
plt.tight_layout(); plt.savefig('latency_budget.png',dpi=150); plt.close()
|
|
||||||
print(' ✓ latency_budget.png')
|
|
||||||
print(' All plots generated.')
|
|
||||||
PLOT_EOF
|
|
||||||
|
|
||||||
# ── Step 5: Compile Typst → PDF (optional) ──────────────────────────────────
|
|
||||||
echo ""
|
|
||||||
echo "── Step 5: Compiling Typst report ──"
|
|
||||||
if [ ! -f "${SCRIPT_DIR}/E2E_Report.typ" ]; then
|
|
||||||
echo " SKIP: E2E_Report.typ template not present."
|
|
||||||
elif ! command -v typst >/dev/null 2>&1; then
|
|
||||||
echo " SKIP: typst not installed."
|
|
||||||
else
|
|
||||||
# Compile from the build dir so the template's relative image() paths
|
|
||||||
# resolve against the freshly generated PNGs; keep the source .typ pristine.
|
|
||||||
cp "${SCRIPT_DIR}/E2E_Report.typ" "${OUT_DIR}/E2E_Report.typ"
|
|
||||||
typst compile "${OUT_DIR}/E2E_Report.typ" "${OUT_DIR}/E2E_Report.pdf" 2>&1
|
|
||||||
if [ -f "${OUT_DIR}/E2E_Report.pdf" ]; then
|
|
||||||
SIZE=$(ls -lh "${OUT_DIR}/E2E_Report.pdf" | awk '{print $5}')
|
|
||||||
echo " ✓ Report generated: ${OUT_DIR}/E2E_Report.pdf (${SIZE})"
|
|
||||||
else
|
|
||||||
echo " ✗ Typst compilation failed"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
echo "=========================================="
|
|
||||||
echo " Done — artifacts in ${OUT_DIR}"
|
|
||||||
echo "=========================================="
|
|
||||||
@@ -1,144 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# run_recorder_e2e.sh — End-to-end test for the StreamHub binary recorder.
|
|
||||||
#
|
|
||||||
# Data path:
|
|
||||||
# FileReader(/tmp/udpstreamer_test_input.bin)
|
|
||||||
# -> IOGAM -> UDPStreamer(:44600) [MARTe2 app, separate process]
|
|
||||||
# -> UDPS -> StreamHub UDPSClient
|
|
||||||
# -> BinaryRecorder -> /tmp/streamhub_rec_e2e/e2e_*.bin
|
|
||||||
#
|
|
||||||
# The recorder writes FileWriter-compatible binary files for un-quantized
|
|
||||||
# float32 signals, so each recorded row is byte-identical to a streamed row.
|
|
||||||
# validate_binary.py confirms every non-zero recorded row matches an input row.
|
|
||||||
#
|
|
||||||
# Usage: ./run_recorder_e2e.sh [--skip-build]
|
|
||||||
set -e
|
|
||||||
|
|
||||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
||||||
REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)"
|
|
||||||
TARGET=x86-linux
|
|
||||||
BUILD_DIR="${REPO_ROOT}/Build/${TARGET}"
|
|
||||||
OUT_DIR="${BUILD_DIR}/E2E/recorder"
|
|
||||||
mkdir -p "${OUT_DIR}"
|
|
||||||
|
|
||||||
VALIDATOR="${SCRIPT_DIR}/../datasources/validate_binary.py"
|
|
||||||
GEN_DATA="${SCRIPT_DIR}/../datasources/gen_test_data.py"
|
|
||||||
INPUT="/tmp/udpstreamer_test_input.bin"
|
|
||||||
REC_DIR="/tmp/streamhub_rec_e2e"
|
|
||||||
|
|
||||||
SKIP_BUILD=0
|
|
||||||
for arg in "$@"; do
|
|
||||||
case "$arg" in
|
|
||||||
--skip-build) SKIP_BUILD=1 ;;
|
|
||||||
--help|-h) echo "Usage: $0 [--skip-build]"; exit 0 ;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
# ── Load environment ─────────────────────────────────────────────────────────
|
|
||||||
ENV_SCRIPT="${REPO_ROOT}/env.sh"
|
|
||||||
if [ ! -f "${ENV_SCRIPT}" ]; then
|
|
||||||
echo "ERROR: ${ENV_SCRIPT} not found." >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
source "${ENV_SCRIPT}"
|
|
||||||
|
|
||||||
COMP="${MARTe2_Components_DIR}/Build/${TARGET}/Components"
|
|
||||||
export LD_LIBRARY_PATH="\
|
|
||||||
${BUILD_DIR}/Components/DataSources/UDPStreamer:\
|
|
||||||
${BUILD_DIR}/Components/Interfaces/UDPStream:\
|
|
||||||
${MARTe2_DIR}/Build/${TARGET}/Core:\
|
|
||||||
${COMP}/DataSources/LinuxTimer:\
|
|
||||||
${COMP}/DataSources/FileDataSource:\
|
|
||||||
${COMP}/GAMs/IOGAM:\
|
|
||||||
${LD_LIBRARY_PATH:-}"
|
|
||||||
|
|
||||||
MARTE_APP="${MARTe2_DIR}/Build/${TARGET}/App/MARTeApp.ex"
|
|
||||||
STREAMHUB_EX="${BUILD_DIR}/StreamHub/StreamHub.ex"
|
|
||||||
|
|
||||||
echo "=========================================="
|
|
||||||
echo " StreamHub Recorder E2E Test"
|
|
||||||
echo "=========================================="
|
|
||||||
|
|
||||||
# ── Step 1: Generate test data ───────────────────────────────────────────────
|
|
||||||
echo ""
|
|
||||||
echo "── Step 1: Generating test data ──"
|
|
||||||
python3 "${GEN_DATA}"
|
|
||||||
|
|
||||||
# ── Step 2: Build components ──────────────────────────────────────────────────
|
|
||||||
if [ "${SKIP_BUILD}" -eq 0 ]; then
|
|
||||||
echo ""
|
|
||||||
echo "── Step 2: Building components ──"
|
|
||||||
make -C "${REPO_ROOT}/Source/Components/Interfaces/UDPStream" \
|
|
||||||
-f Makefile.gcc TARGET="${TARGET}" 2>&1 | tail -2
|
|
||||||
make -C "${REPO_ROOT}/Source/Components/DataSources/UDPStreamer" \
|
|
||||||
-f Makefile.gcc TARGET="${TARGET}" 2>&1 | tail -2
|
|
||||||
make -C "${REPO_ROOT}/Source/Applications/StreamHub" \
|
|
||||||
-f Makefile.gcc TARGET="${TARGET}" 2>&1 | tail -2
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ ! -x "${MARTE_APP}" ]; then
|
|
||||||
echo "ERROR: MARTeApp.ex not found at ${MARTE_APP}" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
if [ ! -x "${STREAMHUB_EX}" ]; then
|
|
||||||
echo "ERROR: StreamHub.ex not found at ${STREAMHUB_EX}" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# ── Step 3: Run the stack ─────────────────────────────────────────────────────
|
|
||||||
echo ""
|
|
||||||
echo "── Step 3: Running StreamHub + UDPStreamer ──"
|
|
||||||
rm -rf "${REC_DIR}"
|
|
||||||
mkdir -p "${REC_DIR}"
|
|
||||||
|
|
||||||
HUB_LOG="${OUT_DIR}/streamhub.log"
|
|
||||||
APP_LOG="${OUT_DIR}/marte.log"
|
|
||||||
|
|
||||||
# Start StreamHub first so it is ready to receive the CONFIG packet.
|
|
||||||
"${STREAMHUB_EX}" -cfg "${SCRIPT_DIR}/StreamHubRec.cfg" > "${HUB_LOG}" 2>&1 &
|
|
||||||
HUB_PID=$!
|
|
||||||
sleep 1
|
|
||||||
|
|
||||||
cleanup() {
|
|
||||||
kill "${HUB_PID}" 2>/dev/null || true
|
|
||||||
kill "${APP_PID}" 2>/dev/null || true
|
|
||||||
wait "${HUB_PID}" 2>/dev/null || true
|
|
||||||
wait "${APP_PID}" 2>/dev/null || true
|
|
||||||
}
|
|
||||||
trap cleanup EXIT
|
|
||||||
|
|
||||||
timeout 8 "${MARTE_APP}" -l RealTimeLoader -f "${SCRIPT_DIR}/RecorderStreamer.cfg" \
|
|
||||||
-s Running > "${APP_LOG}" 2>&1 &
|
|
||||||
APP_PID=$!
|
|
||||||
|
|
||||||
# Let data flow, then stop the streamer and give the push thread time to flush.
|
|
||||||
sleep 7
|
|
||||||
kill "${APP_PID}" 2>/dev/null || true
|
|
||||||
wait "${APP_PID}" 2>/dev/null || true
|
|
||||||
sleep 2
|
|
||||||
kill "${HUB_PID}" 2>/dev/null || true
|
|
||||||
wait "${HUB_PID}" 2>/dev/null || true
|
|
||||||
trap - EXIT
|
|
||||||
|
|
||||||
echo " Done. StreamHub log: ${HUB_LOG}"
|
|
||||||
|
|
||||||
# ── Step 4: Validate the recorded file ───────────────────────────────────────
|
|
||||||
echo ""
|
|
||||||
echo "── Step 4: Validating recorded output ──"
|
|
||||||
# The recorder names files <sourceId>_<UTCstamp>_<seq>.bin; pick the newest.
|
|
||||||
REC_FILE="$(ls -t "${REC_DIR}"/*.bin 2>/dev/null | head -1 || true)"
|
|
||||||
if [ -z "${REC_FILE}" ]; then
|
|
||||||
echo " ✗ FAIL: no recorded .bin file in ${REC_DIR}"
|
|
||||||
echo " --- StreamHub log tail ---"
|
|
||||||
tail -20 "${HUB_LOG}" || true
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
echo " Recorded file: ${REC_FILE} ($(stat -c%s "${REC_FILE}") B)"
|
|
||||||
|
|
||||||
python3 "${VALIDATOR}" "${INPUT}" "${REC_FILE}" --label "recorder" \
|
|
||||||
--json "${OUT_DIR}/recorder_e2e.json"
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
echo "=========================================="
|
|
||||||
echo " Done — artifacts in ${OUT_DIR}"
|
|
||||||
echo "=========================================="
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
module streamhub-e2e
|
|
||||||
|
|
||||||
go 1.21
|
|
||||||
|
|
||||||
require github.com/gorilla/websocket v1.5.1
|
|
||||||
|
|
||||||
require golang.org/x/net v0.17.0 // indirect
|
|
||||||
@@ -1,561 +0,0 @@
|
|||||||
// Command streamhub-e2e is an end-to-end test client for the C++ StreamHub.
|
|
||||||
//
|
|
||||||
// It connects to a running StreamHub WebSocket endpoint (with at least one
|
|
||||||
// connected UDPStreamer source, e.g. the stack launched by run_e2e_test.sh)
|
|
||||||
// and verifies the full protocol:
|
|
||||||
//
|
|
||||||
// 1. "sources" event with at least one connected source
|
|
||||||
// 2. "config" event per source with at least one signal
|
|
||||||
// 3. binary v1 data pushes: parseable, per-signal monotonic time,
|
|
||||||
// timestamps within a few seconds of wall clock (Unix time base)
|
|
||||||
// 4. "stats" event with a positive receive rate
|
|
||||||
// 5. WS zoom round-trip: reqId echoed, points returned in [t0,t1]
|
|
||||||
// 6. hub-side trigger: setTrigger+arm → triggerState(armed) → binary v2
|
|
||||||
// capture frame with the latched pre/post window
|
|
||||||
//
|
|
||||||
// Exit code 0 on success; 1 with a FAIL message otherwise.
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/binary"
|
|
||||||
"encoding/json"
|
|
||||||
"flag"
|
|
||||||
"fmt"
|
|
||||||
"log"
|
|
||||||
"math"
|
|
||||||
"os"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/gorilla/websocket"
|
|
||||||
)
|
|
||||||
|
|
||||||
var hub = flag.String("hub", "127.0.0.1:8090", "StreamHub host:port")
|
|
||||||
var timeout = flag.Duration("timeout", 30*time.Second, "overall test timeout")
|
|
||||||
var verbose = flag.Bool("v", false, "log every received event")
|
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
|
||||||
// Wire types (subset of the StreamHub JSON protocol)
|
|
||||||
// ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
type sourceInfo struct {
|
|
||||||
ID string `json:"id"`
|
|
||||||
Label string `json:"label"`
|
|
||||||
Addr string `json:"addr"`
|
|
||||||
State string `json:"state"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type signalInfo struct {
|
|
||||||
Name string `json:"name"`
|
|
||||||
TypeCode uint32 `json:"typeCode"`
|
|
||||||
NumRows uint32 `json:"numRows"`
|
|
||||||
NumCols uint32 `json:"numCols"`
|
|
||||||
TimeMode int `json:"timeMode"`
|
|
||||||
Rate float64 `json:"samplingRate"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type statInfo struct {
|
|
||||||
State string `json:"state"`
|
|
||||||
TotalReceived uint64 `json:"totalReceived"`
|
|
||||||
RateHz float64 `json:"rateHz"`
|
|
||||||
CycleHist []f64 `json:"cycleHist"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type f64 = float64
|
|
||||||
|
|
||||||
type zoomPoints struct {
|
|
||||||
T []float64 `json:"t"`
|
|
||||||
V []float64 `json:"v"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type historyInfoMsg struct {
|
|
||||||
Enabled bool `json:"enabled"`
|
|
||||||
DurationHours float64 `json:"durationHours"`
|
|
||||||
Decimation uint32 `json:"decimation"`
|
|
||||||
Signals map[string]struct {
|
|
||||||
T0 float64 `json:"t0"`
|
|
||||||
T1 float64 `json:"t1"`
|
|
||||||
Count uint32 `json:"count"`
|
|
||||||
Capacity uint32 `json:"capacity"`
|
|
||||||
} `json:"signals"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type event struct {
|
|
||||||
Type string `json:"type"`
|
|
||||||
Sources json.RawMessage `json:"sources"`
|
|
||||||
SourceID string `json:"sourceId"`
|
|
||||||
Signals json.RawMessage `json:"signals"`
|
|
||||||
ReqID uint32 `json:"reqId"`
|
|
||||||
State string `json:"state"`
|
|
||||||
TrigTime float64 `json:"trigTime"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Parsed binary v1 push frame: sourceId → signal → samples.
|
|
||||||
type pushFrame struct {
|
|
||||||
sourceID string
|
|
||||||
signals map[string]zoomPoints
|
|
||||||
}
|
|
||||||
|
|
||||||
// Parsed binary v2 capture frame.
|
|
||||||
type captureFrame struct {
|
|
||||||
trigTime, preSec, postSec float64
|
|
||||||
signals map[string]zoomPoints
|
|
||||||
}
|
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
|
||||||
// Binary parsers
|
|
||||||
// ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
func parsePush(b []byte) (*pushFrame, error) {
|
|
||||||
if len(b) < 2 || b[0] != 1 {
|
|
||||||
return nil, fmt.Errorf("not a v1 frame")
|
|
||||||
}
|
|
||||||
idLen := int(b[1])
|
|
||||||
off := 2
|
|
||||||
if len(b) < off+idLen+4 {
|
|
||||||
return nil, fmt.Errorf("truncated header")
|
|
||||||
}
|
|
||||||
f := &pushFrame{sourceID: string(b[off : off+idLen]),
|
|
||||||
signals: map[string]zoomPoints{}}
|
|
||||||
off += idLen
|
|
||||||
nSig := int(binary.LittleEndian.Uint32(b[off:]))
|
|
||||||
off += 4
|
|
||||||
for s := 0; s < nSig; s++ {
|
|
||||||
if len(b) < off+2 {
|
|
||||||
return nil, fmt.Errorf("truncated keyLen (sig %d)", s)
|
|
||||||
}
|
|
||||||
keyLen := int(binary.LittleEndian.Uint16(b[off:]))
|
|
||||||
off += 2
|
|
||||||
if len(b) < off+keyLen+4 {
|
|
||||||
return nil, fmt.Errorf("truncated key (sig %d)", s)
|
|
||||||
}
|
|
||||||
key := string(b[off : off+keyLen])
|
|
||||||
off += keyLen
|
|
||||||
n := int(binary.LittleEndian.Uint32(b[off:]))
|
|
||||||
off += 4
|
|
||||||
if len(b) < off+16*n {
|
|
||||||
return nil, fmt.Errorf("truncated data (sig %s n=%d)", key, n)
|
|
||||||
}
|
|
||||||
pts := zoomPoints{T: make([]float64, n), V: make([]float64, n)}
|
|
||||||
for i := 0; i < n; i++ {
|
|
||||||
pts.T[i] = math.Float64frombits(binary.LittleEndian.Uint64(b[off+8*i:]))
|
|
||||||
}
|
|
||||||
off += 8 * n
|
|
||||||
for i := 0; i < n; i++ {
|
|
||||||
pts.V[i] = math.Float64frombits(binary.LittleEndian.Uint64(b[off+8*i:]))
|
|
||||||
}
|
|
||||||
off += 8 * n
|
|
||||||
f.signals[key] = pts
|
|
||||||
}
|
|
||||||
return f, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func parseCapture(b []byte) (*captureFrame, error) {
|
|
||||||
if len(b) < 1+24+4 || b[0] != 2 {
|
|
||||||
return nil, fmt.Errorf("not a v2 frame")
|
|
||||||
}
|
|
||||||
rdF64 := func(off int) float64 {
|
|
||||||
return math.Float64frombits(binary.LittleEndian.Uint64(b[off:]))
|
|
||||||
}
|
|
||||||
f := &captureFrame{
|
|
||||||
trigTime: rdF64(1), preSec: rdF64(9), postSec: rdF64(17),
|
|
||||||
signals: map[string]zoomPoints{},
|
|
||||||
}
|
|
||||||
off := 25
|
|
||||||
nSig := int(binary.LittleEndian.Uint32(b[off:]))
|
|
||||||
off += 4
|
|
||||||
for s := 0; s < nSig; s++ {
|
|
||||||
keyLen := int(binary.LittleEndian.Uint16(b[off:]))
|
|
||||||
off += 2
|
|
||||||
key := string(b[off : off+keyLen])
|
|
||||||
off += keyLen
|
|
||||||
n := int(binary.LittleEndian.Uint32(b[off:]))
|
|
||||||
off += 4
|
|
||||||
if len(b) < off+16*n {
|
|
||||||
return nil, fmt.Errorf("truncated capture (sig %s n=%d)", key, n)
|
|
||||||
}
|
|
||||||
pts := zoomPoints{T: make([]float64, n), V: make([]float64, n)}
|
|
||||||
for i := 0; i < n; i++ {
|
|
||||||
pts.T[i] = math.Float64frombits(binary.LittleEndian.Uint64(b[off+8*i:]))
|
|
||||||
}
|
|
||||||
off += 8 * n
|
|
||||||
for i := 0; i < n; i++ {
|
|
||||||
pts.V[i] = math.Float64frombits(binary.LittleEndian.Uint64(b[off+8*i:]))
|
|
||||||
}
|
|
||||||
off += 8 * n
|
|
||||||
f.signals[key] = pts
|
|
||||||
}
|
|
||||||
return f, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
|
||||||
// Test driver
|
|
||||||
// ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
type client struct {
|
|
||||||
ws *websocket.Conn
|
|
||||||
deadline time.Time
|
|
||||||
|
|
||||||
sources []sourceInfo
|
|
||||||
configs map[string][]signalInfo // sourceId → signals
|
|
||||||
pushes []*pushFrame
|
|
||||||
stats map[string]statInfo
|
|
||||||
zooms map[uint32]map[string]zoomPoints
|
|
||||||
histZooms map[uint32]map[string]zoomPoints
|
|
||||||
historyInfo *historyInfoMsg
|
|
||||||
trigSt []string // observed triggerState sequence
|
|
||||||
captures []*captureFrame
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *client) send(v interface{}) {
|
|
||||||
b, _ := json.Marshal(v)
|
|
||||||
if err := c.ws.WriteMessage(websocket.TextMessage, b); err != nil {
|
|
||||||
fail("ws write: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// pump reads one WS message (with a short read deadline) and dispatches it.
|
|
||||||
func (c *client) pump() {
|
|
||||||
c.ws.SetReadDeadline(time.Now().Add(500 * time.Millisecond))
|
|
||||||
mt, data, err := c.ws.ReadMessage()
|
|
||||||
if err != nil {
|
|
||||||
if websocket.IsUnexpectedCloseError(err) {
|
|
||||||
fail("ws closed: %v", err)
|
|
||||||
}
|
|
||||||
return // read timeout — fine
|
|
||||||
}
|
|
||||||
switch mt {
|
|
||||||
case websocket.BinaryMessage:
|
|
||||||
if len(data) == 0 {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
switch data[0] {
|
|
||||||
case 1:
|
|
||||||
if f, err := parsePush(data); err == nil {
|
|
||||||
c.pushes = append(c.pushes, f)
|
|
||||||
} else {
|
|
||||||
fail("bad v1 frame: %v", err)
|
|
||||||
}
|
|
||||||
case 2:
|
|
||||||
if f, err := parseCapture(data); err == nil {
|
|
||||||
c.captures = append(c.captures, f)
|
|
||||||
} else {
|
|
||||||
fail("bad v2 frame: %v", err)
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
fail("unknown binary frame version %d", data[0])
|
|
||||||
}
|
|
||||||
case websocket.TextMessage:
|
|
||||||
var ev event
|
|
||||||
if err := json.Unmarshal(data, &ev); err != nil {
|
|
||||||
fail("bad JSON event: %v (%.120s)", err, data)
|
|
||||||
}
|
|
||||||
if *verbose {
|
|
||||||
log.Printf("event %-12s %.160s", ev.Type, data)
|
|
||||||
}
|
|
||||||
switch ev.Type {
|
|
||||||
case "sources":
|
|
||||||
var srcs []sourceInfo
|
|
||||||
if err := json.Unmarshal(ev.Sources, &srcs); err == nil {
|
|
||||||
c.sources = srcs
|
|
||||||
}
|
|
||||||
case "config":
|
|
||||||
var sigs []signalInfo
|
|
||||||
if err := json.Unmarshal(ev.Signals, &sigs); err == nil {
|
|
||||||
c.configs[ev.SourceID] = sigs
|
|
||||||
} else {
|
|
||||||
log.Printf("config parse error: %v (%.200s)", err, data)
|
|
||||||
}
|
|
||||||
case "stats":
|
|
||||||
var st map[string]statInfo
|
|
||||||
if err := json.Unmarshal(ev.Sources, &st); err == nil {
|
|
||||||
c.stats = st
|
|
||||||
}
|
|
||||||
case "zoom":
|
|
||||||
var body struct {
|
|
||||||
Signals map[string]zoomPoints `json:"signals"`
|
|
||||||
}
|
|
||||||
if err := json.Unmarshal(data, &body); err == nil {
|
|
||||||
c.zooms[ev.ReqID] = body.Signals
|
|
||||||
}
|
|
||||||
case "historyZoom":
|
|
||||||
var body struct {
|
|
||||||
Signals map[string]zoomPoints `json:"signals"`
|
|
||||||
}
|
|
||||||
if err := json.Unmarshal(data, &body); err == nil {
|
|
||||||
c.histZooms[ev.ReqID] = body.Signals
|
|
||||||
}
|
|
||||||
case "historyInfo":
|
|
||||||
var hi historyInfoMsg
|
|
||||||
if err := json.Unmarshal(data, &hi); err == nil {
|
|
||||||
c.historyInfo = &hi
|
|
||||||
}
|
|
||||||
case "triggerState":
|
|
||||||
c.trigSt = append(c.trigSt, ev.State)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// waitFor pumps messages until cond() or the step deadline expires.
|
|
||||||
func (c *client) waitFor(what string, d time.Duration, cond func() bool) {
|
|
||||||
end := time.Now().Add(d)
|
|
||||||
if end.After(c.deadline) {
|
|
||||||
end = c.deadline
|
|
||||||
}
|
|
||||||
for time.Now().Before(end) {
|
|
||||||
if cond() {
|
|
||||||
log.Printf("OK %s", what)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
c.pump()
|
|
||||||
}
|
|
||||||
fail("timeout waiting for %s", what)
|
|
||||||
}
|
|
||||||
|
|
||||||
func fail(format string, args ...interface{}) {
|
|
||||||
fmt.Printf("FAIL "+format+"\n", args...)
|
|
||||||
os.Exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
flag.Parse()
|
|
||||||
url := "ws://" + *hub + "/ws"
|
|
||||||
log.Printf("connecting to %s", url)
|
|
||||||
|
|
||||||
ws, _, err := websocket.DefaultDialer.Dial(url, nil)
|
|
||||||
if err != nil {
|
|
||||||
fail("dial %s: %v", url, err)
|
|
||||||
}
|
|
||||||
defer ws.Close()
|
|
||||||
|
|
||||||
c := &client{
|
|
||||||
ws: ws,
|
|
||||||
deadline: time.Now().Add(*timeout),
|
|
||||||
configs: map[string][]signalInfo{},
|
|
||||||
zooms: map[uint32]map[string]zoomPoints{},
|
|
||||||
histZooms: map[uint32]map[string]zoomPoints{},
|
|
||||||
}
|
|
||||||
|
|
||||||
// ── 1. sources ────────────────────────────────────────────────────────
|
|
||||||
c.send(map[string]interface{}{"type": "getSources"})
|
|
||||||
c.waitFor("sources event with a connected source", 10*time.Second, func() bool {
|
|
||||||
for _, s := range c.sources {
|
|
||||||
if s.State == "connected" {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
})
|
|
||||||
|
|
||||||
// ── 2. config per connected source ───────────────────────────────────
|
|
||||||
for _, s := range c.sources {
|
|
||||||
log.Printf("source %s (%s): state=%s", s.ID, s.Label, s.State)
|
|
||||||
c.send(map[string]interface{}{"type": "getConfig", "sourceId": s.ID})
|
|
||||||
}
|
|
||||||
c.waitFor("config with signals for every connected source", 10*time.Second, func() bool {
|
|
||||||
for _, s := range c.sources {
|
|
||||||
if s.State != "connected" {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if len(c.configs[s.ID]) == 0 {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return len(c.sources) > 0
|
|
||||||
})
|
|
||||||
|
|
||||||
// ── 3. binary pushes: wall-clock time base + monotonicity ────────────
|
|
||||||
c.waitFor("binary v1 data pushes (>=10 frames)", 10*time.Second, func() bool {
|
|
||||||
return len(c.pushes) >= 10
|
|
||||||
})
|
|
||||||
now := float64(time.Now().UnixNano()) / 1e9
|
|
||||||
seen := map[string][]float64{} // last times per src:sig
|
|
||||||
for _, f := range c.pushes {
|
|
||||||
for key, pts := range f.signals {
|
|
||||||
full := f.sourceID + ":" + key
|
|
||||||
for i, t := range pts.T {
|
|
||||||
if math.Abs(t-now) > 30.0 {
|
|
||||||
fail("timestamp not wall-clock: %s t=%.3f now=%.3f", full, t, now)
|
|
||||||
}
|
|
||||||
prev := seen[full]
|
|
||||||
if len(prev) > 0 && t < prev[len(prev)-1]-1e-9 {
|
|
||||||
fail("non-monotonic time on %s: %.9f after %.9f (i=%d)",
|
|
||||||
full, t, prev[len(prev)-1], i)
|
|
||||||
}
|
|
||||||
seen[full] = append(seen[full], t)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if len(seen) == 0 {
|
|
||||||
fail("pushes contained no signal data")
|
|
||||||
}
|
|
||||||
log.Printf("OK wall-clock & monotonic time on %d signal streams", len(seen))
|
|
||||||
|
|
||||||
// ── 4. stats ──────────────────────────────────────────────────────────
|
|
||||||
c.send(map[string]interface{}{"type": "getStats"})
|
|
||||||
c.waitFor("stats with positive rate", 10*time.Second, func() bool {
|
|
||||||
for _, st := range c.stats {
|
|
||||||
if st.State == "connected" && st.RateHz > 0 && st.TotalReceived > 0 {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
})
|
|
||||||
|
|
||||||
// ── 5. zoom round-trip ───────────────────────────────────────────────
|
|
||||||
// Use the busiest streamed signal and the time range we actually saw.
|
|
||||||
var zoomKey string
|
|
||||||
var zMax int
|
|
||||||
for k, ts := range seen {
|
|
||||||
if len(ts) > zMax {
|
|
||||||
zMax, zoomKey = len(ts), k
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ts := seen[zoomKey]
|
|
||||||
t1 := ts[len(ts)-1]
|
|
||||||
t0 := t1 - 0.5
|
|
||||||
const reqID = 4242
|
|
||||||
c.send(map[string]interface{}{
|
|
||||||
"type": "zoom", "reqId": reqID, "t0": t0, "t1": t1, "n": 200,
|
|
||||||
"signals": zoomKey,
|
|
||||||
})
|
|
||||||
c.waitFor(fmt.Sprintf("zoom reply (reqId=%d, %s)", reqID, zoomKey),
|
|
||||||
10*time.Second, func() bool {
|
|
||||||
sigs, ok := c.zooms[reqID]
|
|
||||||
if !ok {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
pts, ok := sigs[zoomKey]
|
|
||||||
if !ok || len(pts.T) < 2 {
|
|
||||||
fail("zoom reply missing %s (got %d signals)", zoomKey, len(sigs))
|
|
||||||
}
|
|
||||||
for _, t := range pts.T {
|
|
||||||
if t < t0-1e-6 || t > t1+1e-6 {
|
|
||||||
fail("zoom point outside range: t=%.9f not in [%.9f,%.9f]", t, t0, t1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
})
|
|
||||||
|
|
||||||
// ── 5b. historyInfo — check the hub broadcast it on connect ─────────
|
|
||||||
if c.historyInfo != nil && c.historyInfo.Enabled {
|
|
||||||
log.Printf("OK historyInfo: enabled, %.1fh, decimation=%d, %d signals",
|
|
||||||
c.historyInfo.DurationHours, c.historyInfo.Decimation,
|
|
||||||
len(c.historyInfo.Signals))
|
|
||||||
|
|
||||||
// ── 5c. historyZoom round-trip ──────────────────────────────────
|
|
||||||
const hReqID = 4243
|
|
||||||
c.send(map[string]interface{}{
|
|
||||||
"type": "historyZoom", "reqId": hReqID,
|
|
||||||
"t0": t0, "t1": t1, "n": 200,
|
|
||||||
"signals": zoomKey,
|
|
||||||
})
|
|
||||||
c.waitFor(fmt.Sprintf("historyZoom reply (reqId=%d, %s)", hReqID, zoomKey),
|
|
||||||
10*time.Second, func() bool {
|
|
||||||
sigs, ok := c.histZooms[hReqID]
|
|
||||||
if !ok {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
pts, ok := sigs[zoomKey]
|
|
||||||
if !ok || len(pts.T) < 1 {
|
|
||||||
// History data may still be sparse right after startup
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
for _, ht := range pts.T {
|
|
||||||
if ht < t0-1e-6 || ht > t1+1e-6 {
|
|
||||||
fail("historyZoom point outside range: t=%.9f not in [%.9f,%.9f]", ht, t0, t1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
log.Println(" (history not enabled — skipping historyZoom test)")
|
|
||||||
}
|
|
||||||
|
|
||||||
// ── 6. trigger: arm → capture ────────────────────────────────────────
|
|
||||||
// Trigger on an *oscillating* signal at its mean observed value: a
|
|
||||||
// monotonic ramp (counter, time array) crosses its past mean only once,
|
|
||||||
// before arming, so a rising edge would never fire on it. Pick the
|
|
||||||
// busiest signal whose last push frame is non-monotonic (a sine).
|
|
||||||
lastVals := map[string][]float64{}
|
|
||||||
for _, f := range c.pushes {
|
|
||||||
for name, pts := range f.signals {
|
|
||||||
if len(pts.V) >= 4 {
|
|
||||||
lastVals[f.sourceID+":"+name] = pts.V
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
trigKey := ""
|
|
||||||
tMaxPts := 0
|
|
||||||
for k, vs := range lastVals {
|
|
||||||
monotonic := true
|
|
||||||
for i := 1; i < len(vs); i++ {
|
|
||||||
if vs[i] < vs[i-1] {
|
|
||||||
monotonic = false
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if !monotonic && len(seen[k]) > tMaxPts {
|
|
||||||
tMaxPts, trigKey = len(seen[k]), k
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if trigKey == "" {
|
|
||||||
fail("no oscillating signal found for trigger test")
|
|
||||||
}
|
|
||||||
vals := lastVals[trigKey]
|
|
||||||
mean := 0.0
|
|
||||||
for _, v := range vals {
|
|
||||||
mean += v
|
|
||||||
}
|
|
||||||
mean /= float64(len(vals))
|
|
||||||
log.Printf(" trigger signal %s, threshold %.6g", trigKey, mean)
|
|
||||||
|
|
||||||
c.send(map[string]interface{}{
|
|
||||||
"type": "setTrigger", "signal": trigKey, "edge": "rising",
|
|
||||||
"threshold": mean, "windowSec": 0.1, "prePercent": 20.0,
|
|
||||||
"mode": "single",
|
|
||||||
})
|
|
||||||
c.send(map[string]interface{}{"type": "arm"})
|
|
||||||
// The trigger can fire within microseconds of arming (5 MS/s sine), so
|
|
||||||
// the broadcast emitted by the arm command may already say "collecting"
|
|
||||||
// or even "triggered" — any of these proves the arm was accepted.
|
|
||||||
c.waitFor("triggerState: armed/collecting/triggered", 5*time.Second, func() bool {
|
|
||||||
for _, s := range c.trigSt {
|
|
||||||
if s == "armed" || s == "collecting" || s == "triggered" {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
})
|
|
||||||
c.waitFor("binary v2 capture frame", 15*time.Second, func() bool {
|
|
||||||
return len(c.captures) > 0
|
|
||||||
})
|
|
||||||
|
|
||||||
cap0 := c.captures[0]
|
|
||||||
if math.Abs(cap0.preSec-0.02) > 1e-9 || math.Abs(cap0.postSec-0.08) > 1e-9 {
|
|
||||||
fail("capture window mismatch: pre=%.6f post=%.6f (want 0.02/0.08)",
|
|
||||||
cap0.preSec, cap0.postSec)
|
|
||||||
}
|
|
||||||
pts, ok := cap0.signals[trigKey]
|
|
||||||
if !ok || len(pts.T) == 0 {
|
|
||||||
fail("capture missing trigger signal %s (%d signals)", trigKey, len(cap0.signals))
|
|
||||||
}
|
|
||||||
for _, t := range pts.T {
|
|
||||||
if t < cap0.trigTime-cap0.preSec-1e-3 || t > cap0.trigTime+cap0.postSec+1e-3 {
|
|
||||||
fail("capture point outside window: t=%.9f trig=%.9f", t, cap0.trigTime)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
log.Printf("OK capture: trig=%.6f pre=%.3fs post=%.3fs %d signals",
|
|
||||||
cap0.trigTime, cap0.preSec, cap0.postSec, len(cap0.signals))
|
|
||||||
|
|
||||||
c.waitFor("triggerState: triggered", 5*time.Second, func() bool {
|
|
||||||
for _, s := range c.trigSt {
|
|
||||||
if s == "triggered" {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
})
|
|
||||||
c.send(map[string]interface{}{"type": "disarm"})
|
|
||||||
|
|
||||||
fmt.Println("PASS streamhub-e2e: all checks passed")
|
|
||||||
}
|
|
||||||
Binary file not shown.
@@ -28,6 +28,8 @@
|
|||||||
#let ok_color = rgb("#1a7f37")
|
#let ok_color = rgb("#1a7f37")
|
||||||
#let bad_color = rgb("#cf222e")
|
#let bad_color = rgb("#cf222e")
|
||||||
#let neutral = rgb("#57606a")
|
#let neutral = rgb("#57606a")
|
||||||
|
#let fail_bg = rgb("#ffebe9") // light-red row background for FAIL rows in scenario tables
|
||||||
|
#let fail_row_fill(is_fail) = (x, y) => if y > 0 and is_fail(y - 1) { fail_bg } else { none }
|
||||||
|
|
||||||
#let warn_color = rgb("#9a6700") // XFAIL — expected/known failure
|
#let warn_color = rgb("#9a6700") // XFAIL — expected/known failure
|
||||||
#let xpass_color = rgb("#8250df") // XPASS — stale marker, needs attention
|
#let xpass_color = rgb("#8250df") // XPASS — stale marker, needs attention
|
||||||
@@ -204,6 +206,7 @@ MARTe2 processes, plus sustained client throughput (recorded samples ÷ duration
|
|||||||
align: (left, right, right, right, right, right),
|
align: (left, right, right, right, right, right),
|
||||||
stroke: 0.4pt + rgb("#d0d7de"),
|
stroke: 0.4pt + rgb("#d0d7de"),
|
||||||
inset: 5pt,
|
inset: 5pt,
|
||||||
|
fill: fail_row_fill(i => e2e.scenarios.at(i).status == "FAIL"),
|
||||||
table.header([*Scenario*], [*Hub CPU (s)*], [*Hub RSS (MB)*],
|
table.header([*Scenario*], [*Hub CPU (s)*], [*Hub RSS (MB)*],
|
||||||
[*MARTe CPU (s)*], [*MARTe RSS (MB)*], [*Throughput (sp/s)*]),
|
[*MARTe CPU (s)*], [*MARTe RSS (MB)*], [*Throughput (sp/s)*]),
|
||||||
..e2e.scenarios.map(sc => {
|
..e2e.scenarios.map(sc => {
|
||||||
@@ -247,6 +250,7 @@ MARTe2 processes, plus sustained client throughput (recorded samples ÷ duration
|
|||||||
align: (left, center, left, left, right, right, right, center, center),
|
align: (left, center, left, left, right, right, right, center, center),
|
||||||
stroke: 0.4pt + rgb("#d0d7de"),
|
stroke: 0.4pt + rgb("#d0d7de"),
|
||||||
inset: 4pt,
|
inset: 4pt,
|
||||||
|
fill: fail_row_fill(i => sc.signals.at(i).pass == false),
|
||||||
table.header([*Signal*], [*Pass*], [*Type*], [*Quant*], [*Max abs err*],
|
table.header([*Signal*], [*Pass*], [*Type*], [*Quant*], [*Max abs err*],
|
||||||
[*Corr*], [*nRMSE*], [*Fidelity*], [*Shape*]),
|
[*Corr*], [*nRMSE*], [*Fidelity*], [*Shape*]),
|
||||||
..sc.signals.map(g => (
|
..sc.signals.map(g => (
|
||||||
@@ -323,6 +327,81 @@ MARTe2 processes, plus sustained client throughput (recorded samples ÷ duration
|
|||||||
#v(6pt)
|
#v(6pt)
|
||||||
]
|
]
|
||||||
|
|
||||||
|
// ── per-kind sections (direct/recorder/debug/tcplogger) ─────────────────────
|
||||||
|
// Raw scenario records here come straight from results.json (not e2e.scenarios'
|
||||||
|
// reshaping), so they only carry id/kind/status/known_issue/metrics — no
|
||||||
|
// waveform-fidelity breakdown (already covered, where applicable, in the
|
||||||
|
// Scenarios section above for chain-kind scenarios; these kinds run through
|
||||||
|
// dedicated non-chain harnesses in run_e2e.sh).
|
||||||
|
#let kind_table(title, block) = {
|
||||||
|
[= #title]
|
||||||
|
[#block.n_pass/#block.n_total passed.]
|
||||||
|
v(4pt)
|
||||||
|
if block.n_total == 0 {
|
||||||
|
text(fill: neutral)[_No scenarios of this kind in this run._]
|
||||||
|
} else {
|
||||||
|
table(
|
||||||
|
columns: (1.4fr, 0.8fr, 2fr),
|
||||||
|
align: (left, center, left),
|
||||||
|
stroke: 0.4pt + rgb("#d0d7de"),
|
||||||
|
inset: 5pt,
|
||||||
|
fill: fail_row_fill(i => block.scenarios.at(i).status == "FAIL"),
|
||||||
|
table.header([*Scenario*], [*Status*], [*Known issue*]),
|
||||||
|
..block.scenarios.map(s => (
|
||||||
|
[#s.id],
|
||||||
|
status_badge(s.status),
|
||||||
|
if s.at("known_issue", default: none) != none {
|
||||||
|
text(size: 8pt, fill: rgb("#7d4e00"))[#s.known_issue]
|
||||||
|
} else { text(fill: neutral)[—] },
|
||||||
|
)).flatten()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#kind_table("Direct Round-Trip (UDPStreamer ↔ UDPStreamerClient)", data.direct)
|
||||||
|
#kind_table("Recorder (BinaryRecorder disk output)", data.recorder)
|
||||||
|
#kind_table("Debug Service E2E", data.debug)
|
||||||
|
#kind_table("TCPLogger E2E", data.tcplogger)
|
||||||
|
#kind_table("Debug Service PAUSE/RESUME E2E", data.debug_pause_resume)
|
||||||
|
|
||||||
|
// ── stress tests ─────────────────────────────────────────────────────────────
|
||||||
|
= Stress Tests
|
||||||
|
#if data.stress == none [
|
||||||
|
_Not run this session._
|
||||||
|
] else [
|
||||||
|
#align(center, status_badge(data.stress.overall) + h(8pt) + text(size: 11pt)[
|
||||||
|
#hl.at("stress_pass", default: 0) passed ·
|
||||||
|
#hl.at("stress_fail", default: 0) failed
|
||||||
|
])
|
||||||
|
#v(4pt)
|
||||||
|
#for (axis, cases) in data.stress.by_axis [
|
||||||
|
== Axis: #raw(axis)
|
||||||
|
#table(
|
||||||
|
columns: (0.8fr, 0.8fr, 1fr, 1fr, 1fr, 1fr),
|
||||||
|
align: (right, center, right, right, right, right),
|
||||||
|
stroke: 0.4pt + rgb("#d0d7de"),
|
||||||
|
inset: 4pt,
|
||||||
|
table.header([*Level*], [*Status*], [*Hub RSS (MB)*], [*MARTe RSS (MB)*],
|
||||||
|
[*Zoom p50 (ms)*], [*Zoom p95 (ms)*]),
|
||||||
|
..cases.map(c => (
|
||||||
|
[#c.at("level", default: "n/a")],
|
||||||
|
status_badge(c.at("status", default: "?")),
|
||||||
|
fnum(c.at("hub_rss_mb", default: none), digits: 1),
|
||||||
|
fnum(c.at("marte_rss_mb", default: none), digits: 1),
|
||||||
|
fnum(c.at("zoom_p50_ms", default: none), digits: 1),
|
||||||
|
fnum(c.at("zoom_p95_ms", default: none), digits: 1),
|
||||||
|
)).flatten()
|
||||||
|
)
|
||||||
|
]
|
||||||
|
#if data.stress_plots.len() > 0 [
|
||||||
|
#v(4pt)
|
||||||
|
== Scaling curves
|
||||||
|
#grid(columns: 2, gutter: 8pt,
|
||||||
|
..data.stress_plots.map(p => image(p, width: 100%))
|
||||||
|
)
|
||||||
|
]
|
||||||
|
]
|
||||||
|
|
||||||
// ── trend plots ──────────────────────────────────────────────────────────────
|
// ── trend plots ──────────────────────────────────────────────────────────────
|
||||||
#if data.trend_plots.len() > 0 [
|
#if data.trend_plots.len() > 0 [
|
||||||
= Trends over runs
|
= Trends over runs
|
||||||
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
@@ -109,7 +109,7 @@ def integration_suite(int_bin, work, timeout=220):
|
|||||||
def go_all_suites(repo, work):
|
def go_all_suites(repo, work):
|
||||||
"""Run Go test suites across all project modules and aggregate results."""
|
"""Run Go test suites across all project modules and aggregate results."""
|
||||||
modules = [
|
modules = [
|
||||||
(os.path.join(repo, "Test/E2E/chain/client"),
|
(os.path.join(repo, "Test/E2E/suite/client"),
|
||||||
"Go (chain-client)"),
|
"Go (chain-client)"),
|
||||||
(os.path.join(repo, "Common/Client/go"),
|
(os.path.join(repo, "Common/Client/go"),
|
||||||
"Go (common udpsprotocol + wshub)"),
|
"Go (common udpsprotocol + wshub)"),
|
||||||
@@ -279,12 +279,15 @@ def cpp_coverage(repo, target):
|
|||||||
if rc != 0 or not os.path.exists(raw):
|
if rc != 0 or not os.path.exists(raw):
|
||||||
cov["note"] = "lcov capture failed: " + (err or out or "")[-160:]
|
cov["note"] = "lcov capture failed: " + (err or out or "")[-160:]
|
||||||
return cov
|
return cov
|
||||||
# Keep only this repo's own sources so the number reflects project code,
|
# Keep only this repo's own Source/ code so the number reflects project
|
||||||
# not the MARTe2 framework headers dragged in by templates/inlines.
|
# code under test, not the MARTe2 framework headers dragged in by
|
||||||
|
# templates/inlines, and not the Test/ harness itself (GTest/Integration
|
||||||
|
# test .cpp files execute every line by construction and sit at ~100%,
|
||||||
|
# which would just inflate the aggregate and clutter the per-file table
|
||||||
|
# with files that were never meant to be "covered").
|
||||||
info = os.path.join(build, "coverage.info")
|
info = os.path.join(build, "coverage.info")
|
||||||
rc2, _, e2 = _run(["lcov", "--extract", raw,
|
rc2, _, e2 = _run(["lcov", "--extract", raw,
|
||||||
os.path.join(repo, "Source", "*"),
|
os.path.join(repo, "Source", "*"),
|
||||||
os.path.join(repo, "Test", "*"),
|
|
||||||
"--output-file", info, "--quiet"] + ign, timeout=300)
|
"--output-file", info, "--quiet"] + ign, timeout=300)
|
||||||
summ_file = info if (rc2 == 0 and os.path.exists(info)) else raw
|
summ_file = info if (rc2 == 0 and os.path.exists(info)) else raw
|
||||||
# Parse the tracefile directly for per-file detail; this also yields the
|
# Parse the tracefile directly for per-file detail; this also yields the
|
||||||
@@ -0,0 +1,82 @@
|
|||||||
|
/**
|
||||||
|
* Trimmed single-thread configuration for the "debug"/"tcplogger" E2E
|
||||||
|
* scenario kinds: exercises DebugService FORCE/TRACE/BREAK over TCP 8080 /
|
||||||
|
* UDP 8081 and TCPLogger delivery over TCP 9090, with no UDPStreamer path.
|
||||||
|
*/
|
||||||
|
|
||||||
|
$App = {
|
||||||
|
Class = RealTimeApplication
|
||||||
|
|
||||||
|
+Functions = {
|
||||||
|
Class = ReferenceContainer
|
||||||
|
|
||||||
|
+TimerGAM = {
|
||||||
|
Class = IOGAM
|
||||||
|
InputSignals = {
|
||||||
|
Counter = {
|
||||||
|
DataSource = Timer
|
||||||
|
Type = uint32
|
||||||
|
Frequency = 1000
|
||||||
|
}
|
||||||
|
Time = {
|
||||||
|
DataSource = Timer
|
||||||
|
Type = uint32
|
||||||
|
}
|
||||||
|
}
|
||||||
|
OutputSignals = {
|
||||||
|
Counter = { DataSource = DDB1 Type = uint32 }
|
||||||
|
Time = { DataSource = DDB1 Type = uint32 }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+Data = {
|
||||||
|
Class = ReferenceContainer
|
||||||
|
DefaultDataSource = DDB1
|
||||||
|
|
||||||
|
+DDB1 = { Class = GAMDataSource }
|
||||||
|
|
||||||
|
+Timer = {
|
||||||
|
Class = LinuxTimer
|
||||||
|
SleepNature = "Default"
|
||||||
|
Signals = {
|
||||||
|
Counter = { Type = uint32 }
|
||||||
|
Time = { Type = uint32 }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+Timings = { Class = TimingDataSource }
|
||||||
|
}
|
||||||
|
|
||||||
|
+States = {
|
||||||
|
Class = ReferenceContainer
|
||||||
|
+Running = {
|
||||||
|
Class = RealTimeState
|
||||||
|
+Threads = {
|
||||||
|
Class = ReferenceContainer
|
||||||
|
|
||||||
|
+Thread1 = {
|
||||||
|
Class = RealTimeThread
|
||||||
|
CPUs = 0x1
|
||||||
|
Functions = {TimerGAM}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+Scheduler = {
|
||||||
|
Class = GAMScheduler
|
||||||
|
TimingDataSource = Timings
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── DebugService ──────────────────────────────────────────────────────────────
|
||||||
|
// Patches the broker registry at startup so every signal is traceable.
|
||||||
|
// TcpLogger is auto-injected on LogPort (9090) — no explicit DataSource needed.
|
||||||
|
+DebugService = {
|
||||||
|
Class = DebugService
|
||||||
|
ControlPort = 8080
|
||||||
|
StreamPort = 8081
|
||||||
|
LogPort = 9090
|
||||||
|
StreamIP = "127.0.0.1"
|
||||||
|
}
|
||||||
Executable
BIN
Binary file not shown.
@@ -0,0 +1,15 @@
|
|||||||
|
module debugclient
|
||||||
|
|
||||||
|
go 1.21
|
||||||
|
|
||||||
|
require marte2debugger v0.0.0
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/gorilla/websocket v1.5.1 // indirect
|
||||||
|
golang.org/x/net v0.17.0 // indirect
|
||||||
|
marte2/common v0.0.0 // indirect
|
||||||
|
)
|
||||||
|
|
||||||
|
replace marte2debugger => ../../../../Client/debugger
|
||||||
|
|
||||||
|
replace marte2/common => ../../../../Common/Client/go
|
||||||
@@ -0,0 +1,403 @@
|
|||||||
|
// Command debugclient drives a running MARTeApp.ex DebugService+TCPLogger
|
||||||
|
// instance over TCP/UDP for the Test/E2E/suite "debug" and "tcplogger"
|
||||||
|
// scenario kinds. It scripts a fixed command sequence, captures responses
|
||||||
|
// and log/trace output, and reports PASS/FAIL as JSON to -out.
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
"sync"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
debugger "marte2debugger/controller" // see go.mod replace directive; marte2debugger is Client/debugger's module name
|
||||||
|
)
|
||||||
|
|
||||||
|
type event struct {
|
||||||
|
kind string
|
||||||
|
data any
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
host := flag.String("host", "127.0.0.1", "MARTeApp host")
|
||||||
|
cmdPort := flag.Int("cmdport", 8080, "DebugService TCP command port")
|
||||||
|
udpPort := flag.Int("udpport", 8081, "DebugService UDP trace port")
|
||||||
|
logPort := flag.Int("logport", 9090, "TCPLogger TCP port")
|
||||||
|
scenario := flag.String("scenario", "", "scenario id (for output naming)")
|
||||||
|
outDir := flag.String("out", "/tmp/debug_e2e", "output directory")
|
||||||
|
mode := flag.String("mode", "debug", "debug|tcplogger|debug_pause_resume")
|
||||||
|
dur := flag.Duration("dur", 4*time.Second, "how long to run the script/collection")
|
||||||
|
flag.Parse()
|
||||||
|
|
||||||
|
if *scenario == "" {
|
||||||
|
fmt.Fprintln(os.Stderr, "missing -scenario")
|
||||||
|
os.Exit(2)
|
||||||
|
}
|
||||||
|
os.MkdirAll(*outDir, 0o755)
|
||||||
|
|
||||||
|
var mu sync.Mutex
|
||||||
|
var events []event
|
||||||
|
sink := func(v any) {
|
||||||
|
mu.Lock()
|
||||||
|
defer mu.Unlock()
|
||||||
|
// runLog (and every other MarteController event site) passes a
|
||||||
|
// map[string]any literal to sink; store it as-is, no
|
||||||
|
// unmarshal/remarshal needed.
|
||||||
|
events = append(events, event{kind: fmt.Sprintf("%T", v), data: v})
|
||||||
|
}
|
||||||
|
|
||||||
|
mc := debugger.NewHeadlessMarteController(sink)
|
||||||
|
mc.Connect(*host, *cmdPort, *udpPort, *logPort)
|
||||||
|
defer mc.Disconnect()
|
||||||
|
|
||||||
|
time.Sleep(500 * time.Millisecond) // allow TCP/UDP/log connects to establish
|
||||||
|
|
||||||
|
// Snapshot the event count *after* the connect-settle sleep so
|
||||||
|
// runTcpLoggerScript only scans events recorded from here on. Without this,
|
||||||
|
// the "log" event that Connect() itself emits synchronously (a "Connecting
|
||||||
|
// to ..." INFO message, well before any TCPLogger TCP traffic happens)
|
||||||
|
// would satisfy the check instantly regardless of whether the real
|
||||||
|
// TCPLogger (port 9090) ever delivers anything for the triggered event.
|
||||||
|
mu.Lock()
|
||||||
|
baseline := len(events)
|
||||||
|
mu.Unlock()
|
||||||
|
|
||||||
|
var ok bool
|
||||||
|
var msg string
|
||||||
|
switch *mode {
|
||||||
|
case "debug":
|
||||||
|
ok, msg = runDebugScript(mc, &events, &mu)
|
||||||
|
case "tcplogger":
|
||||||
|
ok, msg = runTcpLoggerScript(mc, *dur, &events, &mu, baseline)
|
||||||
|
case "debug_pause_resume":
|
||||||
|
ok, msg = runPauseResumeScript(mc, &events, &mu)
|
||||||
|
default:
|
||||||
|
fmt.Fprintf(os.Stderr, "unknown -mode %q\n", *mode)
|
||||||
|
os.Exit(2)
|
||||||
|
}
|
||||||
|
|
||||||
|
time.Sleep(300 * time.Millisecond) // drain final events
|
||||||
|
|
||||||
|
result := map[string]any{
|
||||||
|
"id": *scenario,
|
||||||
|
"pass": ok,
|
||||||
|
"detail": msg,
|
||||||
|
}
|
||||||
|
f, _ := os.Create(fmt.Sprintf("%s/result_%s.json", *outDir, *scenario))
|
||||||
|
json.NewEncoder(f).Encode(result)
|
||||||
|
f.Close()
|
||||||
|
|
||||||
|
status := "FAIL"
|
||||||
|
if ok {
|
||||||
|
status = "PASS"
|
||||||
|
}
|
||||||
|
fmt.Printf("%s: %s - %s\n", *scenario, status, msg)
|
||||||
|
os.WriteFile(fmt.Sprintf("%s/status_%s.txt", *outDir, *scenario), []byte(status), 0o644)
|
||||||
|
|
||||||
|
if !ok {
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// waitForAck polls events (from index start onward) for a MarteController
|
||||||
|
// "text_line" event exactly matching DebugServiceBase::HandleCommand's
|
||||||
|
// "OK <token> <count>\n" reply grammar, requiring count > 0. HandleCommand
|
||||||
|
// prints this reply for every one of FORCE/UNFORCE/TRACE/BREAK regardless of
|
||||||
|
// enable/disable direction, and count is always "number of signals the
|
||||||
|
// command actually matched" (DebugServiceBase.cpp:1468-1525) — so count==0
|
||||||
|
// means the target signal path was never resolved (e.g. a wire-format/name-
|
||||||
|
// translation bug), which a bare "did the socket stay open" check like the
|
||||||
|
// old runDebugScript could never catch.
|
||||||
|
func waitForAck(events *[]event, mu *sync.Mutex, start int, token string, timeout time.Duration) (string, bool) {
|
||||||
|
prefix := "OK " + token + " "
|
||||||
|
deadline := time.Now().Add(timeout)
|
||||||
|
for time.Now().Before(deadline) {
|
||||||
|
mu.Lock()
|
||||||
|
for _, e := range (*events)[start:] {
|
||||||
|
m, ok := e.data.(map[string]any)
|
||||||
|
if !ok || m["type"] != "text_line" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
line, _ := m["data"].(string)
|
||||||
|
if !strings.HasPrefix(line, prefix) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
var count uint32
|
||||||
|
if _, err := fmt.Sscanf(line, prefix+"%d", &count); err == nil && count > 0 {
|
||||||
|
mu.Unlock()
|
||||||
|
return line, true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mu.Unlock()
|
||||||
|
time.Sleep(50 * time.Millisecond)
|
||||||
|
}
|
||||||
|
return "", false
|
||||||
|
}
|
||||||
|
|
||||||
|
// runDebugScript exercises FORCE/TRACE/BREAK over the TCP 8080 command
|
||||||
|
// protocol (grammar confirmed against Source/Components/Interfaces/
|
||||||
|
// DebugService/DebugServiceBase.cpp's HandleCommand: "FORCE <name> <val>",
|
||||||
|
// "TRACE <name> <0|1> [decim]", "BREAK <name> <op|OFF> <threshold>",
|
||||||
|
// each replying "OK <TOKEN> <count>\n"). Each step waits for the real
|
||||||
|
// "OK <TOKEN> <count>" acknowledgement with count > 0 via waitForAck,
|
||||||
|
// confirming DebugService actually resolved and applied the command against
|
||||||
|
// the named signal — not merely that the TCP connection stayed alive (which
|
||||||
|
// would pass even if DebugService silently no-op'd every command, e.g. due
|
||||||
|
// to a signal-name/wire-format bug).
|
||||||
|
func runDebugScript(mc *debugger.MarteController, events *[]event, mu *sync.Mutex) (bool, string) {
|
||||||
|
const ackTimeout = 2 * time.Second
|
||||||
|
|
||||||
|
mu.Lock()
|
||||||
|
start := len(*events)
|
||||||
|
mu.Unlock()
|
||||||
|
mc.SendCommand("FORCE App.Data.Timer.Counter 42")
|
||||||
|
if _, ok := waitForAck(events, mu, start, "FORCE", ackTimeout); !ok {
|
||||||
|
return false, "no \"OK FORCE <count>\" ack with count>0 received (signal not resolved)"
|
||||||
|
}
|
||||||
|
|
||||||
|
mu.Lock()
|
||||||
|
start = len(*events)
|
||||||
|
mu.Unlock()
|
||||||
|
mc.SendCommand("TRACE App.Data.Timer.Counter 1 1")
|
||||||
|
if _, ok := waitForAck(events, mu, start, "TRACE", ackTimeout); !ok {
|
||||||
|
return false, "no \"OK TRACE <count>\" ack with count>0 received (signal not resolved)"
|
||||||
|
}
|
||||||
|
|
||||||
|
mu.Lock()
|
||||||
|
start = len(*events)
|
||||||
|
mu.Unlock()
|
||||||
|
mc.SendCommand("BREAK App.Data.Timer.Counter > 1000")
|
||||||
|
if _, ok := waitForAck(events, mu, start, "BREAK", ackTimeout); !ok {
|
||||||
|
return false, "no \"OK BREAK <count>\" ack with count>0 received for SetBreak (signal not resolved)"
|
||||||
|
}
|
||||||
|
|
||||||
|
mu.Lock()
|
||||||
|
start = len(*events)
|
||||||
|
mu.Unlock()
|
||||||
|
mc.SendCommand("BREAK App.Data.Timer.Counter OFF")
|
||||||
|
if _, ok := waitForAck(events, mu, start, "BREAK", ackTimeout); !ok {
|
||||||
|
return false, "no \"OK BREAK <count>\" ack with count>0 received for ClearBreak (signal not resolved)"
|
||||||
|
}
|
||||||
|
|
||||||
|
mu.Lock()
|
||||||
|
start = len(*events)
|
||||||
|
mu.Unlock()
|
||||||
|
mc.SendCommand("UNFORCE App.Data.Timer.Counter")
|
||||||
|
if _, ok := waitForAck(events, mu, start, "UNFORCE", ackTimeout); !ok {
|
||||||
|
return false, "no \"OK UNFORCE <count>\" ack with count>0 received (signal not resolved)"
|
||||||
|
}
|
||||||
|
|
||||||
|
if !mc.IsConnected() {
|
||||||
|
return false, "lost connection to DebugService during script"
|
||||||
|
}
|
||||||
|
return true, "FORCE/TRACE/BREAK/UNFORCE all acknowledged with count>0 (real signal resolution confirmed)"
|
||||||
|
}
|
||||||
|
|
||||||
|
// runTcpLoggerScript triggers a log-worthy event and waits for a matching
|
||||||
|
// "log" event to arrive over the real TCPLogger TCP connection (port 9090)
|
||||||
|
// within dur.
|
||||||
|
//
|
||||||
|
// NOTE: an invalid "FORCE <nonexistent signal> <val>" is *not* usable here —
|
||||||
|
// DebugServiceBase::ForceSignal() silently no-ops (count stays 0, no
|
||||||
|
// REPORT_ERROR call) when no signal matches, so it never reaches the logger
|
||||||
|
// at all. Instead we send "MSG <nonexistent destination> <fn> 0", which
|
||||||
|
// DebugServiceBase::HandleCommand's MSG handler always resolves via
|
||||||
|
// ObjectRegistryDatabase::Find() and, on failure, does call
|
||||||
|
// REPORT_ERROR_STATIC(Warning, "MSG: destination '%s' not found in ORD.")
|
||||||
|
// (Source/Components/Interfaces/DebugService/DebugServiceBase.cpp) — a real,
|
||||||
|
// synchronous, deterministic log emission that the framework's LoggerService
|
||||||
|
// broadcasts to the auto-injected TcpLogger, which then writes
|
||||||
|
// "LOG <level> <description>\n" to every connected TCP client (see
|
||||||
|
// Source/Components/Interfaces/TCPLogger/TcpLogger.cpp ConsumeLogMessage /
|
||||||
|
// Execute). MarteController's runLog reads that line from the real TCP 9090
|
||||||
|
// socket and forwards it through sink as map[string]any{"type": "log",
|
||||||
|
// "time": ..., "level": ..., "message": ...}.
|
||||||
|
//
|
||||||
|
// baseline is the length of *events captured right after the initial
|
||||||
|
// connect-settle sleep, before this function sends the MSG command: only
|
||||||
|
// events recorded from index baseline onward are eligible, so the "log"
|
||||||
|
// event that MarteController.Connect() itself emits synchronously (a
|
||||||
|
// "Connecting to ..." INFO message, emitted before any TCP/UDP/log socket
|
||||||
|
// activity) can never satisfy this check.
|
||||||
|
func runTcpLoggerScript(mc *debugger.MarteController, dur time.Duration, events *[]event, mu *sync.Mutex, baseline int) (bool, string) {
|
||||||
|
const missingDest = "DebugClientNoSuchDestination"
|
||||||
|
mc.SendCommand(fmt.Sprintf("MSG %s SomeFunction 0", missingDest))
|
||||||
|
deadline := time.Now().Add(dur)
|
||||||
|
for time.Now().Before(deadline) {
|
||||||
|
mu.Lock()
|
||||||
|
for _, e := range (*events)[baseline:] {
|
||||||
|
if m, ok := e.data.(map[string]any); ok && m["type"] == "log" {
|
||||||
|
msg, _ := m["message"].(string)
|
||||||
|
// MarteController.writeCmd() also emits a client-side "CMD"
|
||||||
|
// level log echoing every outgoing command as "→ <cmd>"
|
||||||
|
// (see martecontrol.go) — since our own MSG command text
|
||||||
|
// contains missingDest, that local echo would otherwise
|
||||||
|
// satisfy a naive substring check instantly, before the real
|
||||||
|
// TCPLogger round-trip ever happens. Require the actual
|
||||||
|
// REPORT_ERROR text the DebugService MSG handler produces
|
||||||
|
// ("not found in ORD"), which can only arrive via runLog's
|
||||||
|
// real TCP 9090 read, never via the local echo.
|
||||||
|
if strings.Contains(msg, missingDest) && strings.Contains(msg, "not found in ORD") {
|
||||||
|
mu.Unlock()
|
||||||
|
return true, fmt.Sprintf("received real TCPLogger log event: %v", m)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mu.Unlock()
|
||||||
|
time.Sleep(100 * time.Millisecond)
|
||||||
|
}
|
||||||
|
if !mc.IsConnected() {
|
||||||
|
return false, "lost connection during tcplogger wait and no matching log event received"
|
||||||
|
}
|
||||||
|
return false, "no matching log event received within duration"
|
||||||
|
}
|
||||||
|
|
||||||
|
// readValueResponse sends "VALUE <name>" and waits for the matching
|
||||||
|
// {"Name":...,"Value":"...",...} JSON reply (DebugServiceBase::GetSignalValue,
|
||||||
|
// dispatched via HandleCommand's "VALUE" token, terminated by a bare
|
||||||
|
// "OK VALUE" sentinel line). MarteController's readLoop recognises the
|
||||||
|
// leading '{' and accumulates until the sentinel, then delivers the clean
|
||||||
|
// JSON text as a map[string]any{"type":"response","tag":"VALUE","data":...}
|
||||||
|
// event. Unlike TRACE, VALUE reads the signal's live memory address directly
|
||||||
|
// regardless of whether tracing is enabled, so it works as a completely
|
||||||
|
// independent observation channel for the PAUSE/RESUME test below.
|
||||||
|
func readValueResponse(events *[]event, mu *sync.Mutex, start int, timeout time.Duration) (uint32, bool) {
|
||||||
|
deadline := time.Now().Add(timeout)
|
||||||
|
for time.Now().Before(deadline) {
|
||||||
|
mu.Lock()
|
||||||
|
for _, e := range (*events)[start:] {
|
||||||
|
m, ok := e.data.(map[string]any)
|
||||||
|
if !ok || m["type"] != "response" || m["tag"] != "VALUE" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
data, _ := m["data"].(string)
|
||||||
|
var v struct {
|
||||||
|
Value string `json:"Value"`
|
||||||
|
}
|
||||||
|
if json.Unmarshal([]byte(data), &v) == nil {
|
||||||
|
var n uint32
|
||||||
|
if _, err := fmt.Sscanf(v.Value, "%d", &n); err == nil {
|
||||||
|
mu.Unlock()
|
||||||
|
return n, true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mu.Unlock()
|
||||||
|
time.Sleep(20 * time.Millisecond)
|
||||||
|
}
|
||||||
|
return 0, false
|
||||||
|
}
|
||||||
|
|
||||||
|
// waitForBareOK waits for a text_line event whose data is exactly "OK" — the
|
||||||
|
// literal reply DebugServiceBase::HandleCommand sends for PAUSE/RESUME
|
||||||
|
// ("out += \"OK\\n\";", no per-signal count unlike FORCE/TRACE/BREAK's
|
||||||
|
// "OK <TOKEN> <count>\n"), so it cannot be confused with those other acks.
|
||||||
|
func waitForBareOK(events *[]event, mu *sync.Mutex, start int, timeout time.Duration) bool {
|
||||||
|
deadline := time.Now().Add(timeout)
|
||||||
|
for time.Now().Before(deadline) {
|
||||||
|
mu.Lock()
|
||||||
|
for _, e := range (*events)[start:] {
|
||||||
|
m, ok := e.data.(map[string]any)
|
||||||
|
if ok && m["type"] == "text_line" && m["data"] == "OK" {
|
||||||
|
mu.Unlock()
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mu.Unlock()
|
||||||
|
time.Sleep(20 * time.Millisecond)
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// runPauseResumeScript exercises PAUSE/RESUME over the TCP 8080 command
|
||||||
|
// protocol. This complements runDebugScript (FORCE/TRACE/BREAK/UNFORCE):
|
||||||
|
// those only confirm DebugService *acknowledges* a command; this confirms
|
||||||
|
// PAUSE actually halts the RT GAM loop rather than merely replying "OK".
|
||||||
|
// DebugBrokerWrapper's pause spin (DebugBrokerWrapper.h) only runs in the
|
||||||
|
// OUTPUT broker's Execute(), AFTER it has already committed the GAM's
|
||||||
|
// result for the current cycle — input brokers deliberately never spin
|
||||||
|
// (would risk stalling cross-thread EventSem posts). So the *input*-side
|
||||||
|
// registration for a signal (e.g. "App.Data.Timer.Counter", the raw
|
||||||
|
// LinuxTimer memory feeding TimerGAM) keeps advancing even while paused;
|
||||||
|
// only the *output*-side registration ("App.Data.DDB1.Counter", TimerGAM's
|
||||||
|
// copy into DDB1 after IOGAM's pass-through) actually freezes. Confirmed
|
||||||
|
// empirically: manual PAUSE/RESUME polling showed Timer.Counter advancing
|
||||||
|
// continuously through the pause window while DDB1.Counter held constant.
|
||||||
|
func runPauseResumeScript(mc *debugger.MarteController, events *[]event, mu *sync.Mutex) (bool, string) {
|
||||||
|
const target = "App.Data.DDB1.Counter"
|
||||||
|
const ackTimeout = 2 * time.Second
|
||||||
|
|
||||||
|
sample := func() (uint32, bool) {
|
||||||
|
mu.Lock()
|
||||||
|
start := len(*events)
|
||||||
|
mu.Unlock()
|
||||||
|
mc.SendCommand("VALUE " + target)
|
||||||
|
return readValueResponse(events, mu, start, ackTimeout)
|
||||||
|
}
|
||||||
|
|
||||||
|
v1, ok := sample()
|
||||||
|
if !ok {
|
||||||
|
return false, "no VALUE response received while running"
|
||||||
|
}
|
||||||
|
time.Sleep(200 * time.Millisecond)
|
||||||
|
v2, ok := sample()
|
||||||
|
if !ok {
|
||||||
|
return false, "no VALUE response received on second running sample"
|
||||||
|
}
|
||||||
|
if v2 <= v1 {
|
||||||
|
return false, fmt.Sprintf("Counter did not advance while running (%d -> %d)", v1, v2)
|
||||||
|
}
|
||||||
|
|
||||||
|
mu.Lock()
|
||||||
|
start := len(*events)
|
||||||
|
mu.Unlock()
|
||||||
|
mc.SendCommand("PAUSE")
|
||||||
|
if !waitForBareOK(events, mu, start, ackTimeout) {
|
||||||
|
return false, "no bare \"OK\" ack received for PAUSE"
|
||||||
|
}
|
||||||
|
|
||||||
|
time.Sleep(100 * time.Millisecond) // let any already-in-flight cycle settle
|
||||||
|
vPause1, ok := sample()
|
||||||
|
if !ok {
|
||||||
|
return false, "no VALUE response received while paused"
|
||||||
|
}
|
||||||
|
time.Sleep(500 * time.Millisecond)
|
||||||
|
vPause2, ok := sample()
|
||||||
|
if !ok {
|
||||||
|
return false, "no VALUE response received on second paused sample"
|
||||||
|
}
|
||||||
|
if vPause2 > vPause1+1 { // tolerate at most one straggling in-flight cycle
|
||||||
|
return false, fmt.Sprintf("Counter kept advancing while paused (%d -> %d)", vPause1, vPause2)
|
||||||
|
}
|
||||||
|
|
||||||
|
mu.Lock()
|
||||||
|
start = len(*events)
|
||||||
|
mu.Unlock()
|
||||||
|
mc.SendCommand("RESUME")
|
||||||
|
if !waitForBareOK(events, mu, start, ackTimeout) {
|
||||||
|
return false, "no bare \"OK\" ack received for RESUME"
|
||||||
|
}
|
||||||
|
|
||||||
|
time.Sleep(200 * time.Millisecond)
|
||||||
|
v3, ok := sample()
|
||||||
|
if !ok {
|
||||||
|
return false, "no VALUE response received after resume"
|
||||||
|
}
|
||||||
|
time.Sleep(200 * time.Millisecond)
|
||||||
|
v4, ok := sample()
|
||||||
|
if !ok {
|
||||||
|
return false, "no VALUE response received on second post-resume sample"
|
||||||
|
}
|
||||||
|
if v4 <= v3 {
|
||||||
|
return false, fmt.Sprintf("Counter did not resume advancing after RESUME (%d -> %d)", v3, v4)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !mc.IsConnected() {
|
||||||
|
return false, "lost connection to DebugService during pause/resume script"
|
||||||
|
}
|
||||||
|
return true, fmt.Sprintf("PAUSE halted Counter (%d -> %d) and RESUME restored advancement (%d -> %d)",
|
||||||
|
vPause1, vPause2, v3, v4)
|
||||||
|
}
|
||||||
@@ -74,6 +74,8 @@ def build_e2e(results, work):
|
|||||||
scen = []
|
scen = []
|
||||||
corrs, rss_vals, cpu_vals, tput_vals = [], [], [], []
|
corrs, rss_vals, cpu_vals, tput_vals = [], [], [], []
|
||||||
for r in results.get("scenarios", []):
|
for r in results.get("scenarios", []):
|
||||||
|
if r.get("kind", "chain") != "chain":
|
||||||
|
continue
|
||||||
sid = r["id"]
|
sid = r["id"]
|
||||||
metrics = r.get("metrics", {})
|
metrics = r.get("metrics", {})
|
||||||
sigs = []
|
sigs = []
|
||||||
@@ -139,6 +141,23 @@ def build_e2e(results, work):
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def build_by_kind(results, kind):
|
||||||
|
"""Filter raw scenario records (as written by run_e2e.sh's results.json
|
||||||
|
aggregation) down to a single scenario `kind` (direct/recorder/debug/
|
||||||
|
tcplogger), with a small pass/fail rollup for the report's headline KPIs
|
||||||
|
and per-kind section."""
|
||||||
|
scenarios = [s for s in results.get("scenarios", []) if s.get("kind") == kind]
|
||||||
|
n_pass = sum(1 for s in scenarios if s.get("status") == "PASS")
|
||||||
|
n_fail = sum(1 for s in scenarios if s.get("status") == "FAIL")
|
||||||
|
return {
|
||||||
|
"kind": kind,
|
||||||
|
"n_pass": n_pass,
|
||||||
|
"n_fail": n_fail,
|
||||||
|
"n_total": len(scenarios),
|
||||||
|
"scenarios": scenarios,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
def headline(e2e, ut, cov):
|
def headline(e2e, ut, cov):
|
||||||
cov_by = {c["name"]: c.get("pct") for c in cov.get("languages", [])}
|
cov_by = {c["name"]: c.get("pct") for c in cov.get("languages", [])}
|
||||||
t = ut.get("totals", {})
|
t = ut.get("totals", {})
|
||||||
@@ -236,12 +255,120 @@ def trend_plots(history, out):
|
|||||||
return made
|
return made
|
||||||
|
|
||||||
|
|
||||||
|
# ── stress (Test/E2E/suite/stress.py + stress_run.py) ───────────────────────
|
||||||
|
_STRESS_LABELS = {
|
||||||
|
"stress_pass": "Stress cases passed",
|
||||||
|
"stress_fail": "Stress cases failed",
|
||||||
|
"stress_max_hub_rss_mb": "Stress max hub RSS (MB)",
|
||||||
|
"stress_max_marte_rss_mb": "Stress max MARTe RSS (MB)",
|
||||||
|
"stress_max_zoom_p95_ms": "Stress max zoom p95 (ms)",
|
||||||
|
}
|
||||||
|
_STRESS_DIRECTION = {
|
||||||
|
"stress_pass": True, "stress_fail": False,
|
||||||
|
"stress_max_hub_rss_mb": False, "stress_max_marte_rss_mb": False,
|
||||||
|
"stress_max_zoom_p95_ms": False,
|
||||||
|
}
|
||||||
|
_DIRECTION.update({
|
||||||
|
"direct_pass": True, "direct_fail": False,
|
||||||
|
"recorder_pass": True, "recorder_fail": False,
|
||||||
|
"debug_pass": True, "debug_fail": False,
|
||||||
|
"tcplogger_pass": True, "tcplogger_fail": False,
|
||||||
|
"debug_pause_resume_pass": True, "debug_pause_resume_fail": False,
|
||||||
|
})
|
||||||
|
_DIRECTION.update(_STRESS_DIRECTION)
|
||||||
|
_LABELS.update({
|
||||||
|
"direct_pass": "Direct scenarios passed", "direct_fail": "Direct scenarios failed",
|
||||||
|
"recorder_pass": "Recorder scenarios passed", "recorder_fail": "Recorder scenarios failed",
|
||||||
|
"debug_pass": "Debug scenarios passed", "debug_fail": "Debug scenarios failed",
|
||||||
|
"tcplogger_pass": "TCPLogger scenarios passed", "tcplogger_fail": "TCPLogger scenarios failed",
|
||||||
|
"debug_pause_resume_pass": "Debug pause/resume scenarios passed",
|
||||||
|
"debug_pause_resume_fail": "Debug pause/resume scenarios failed",
|
||||||
|
})
|
||||||
|
_LABELS.update(_STRESS_LABELS)
|
||||||
|
|
||||||
|
|
||||||
|
def build_stress(sr):
|
||||||
|
"""Shape stress_results.json into the report's stress block (+ by_axis)."""
|
||||||
|
cases = sr.get("cases", []) or []
|
||||||
|
by_axis = {}
|
||||||
|
for c in cases:
|
||||||
|
by_axis.setdefault(c.get("axis", "?"), []).append(c)
|
||||||
|
for axis in by_axis:
|
||||||
|
by_axis[axis].sort(key=lambda c: c.get("level", 0))
|
||||||
|
return {"overall": sr.get("overall", "FAIL"), "cases": cases,
|
||||||
|
"by_axis": by_axis}
|
||||||
|
|
||||||
|
|
||||||
|
def stress_headline(stress):
|
||||||
|
cases = stress.get("cases", []) or []
|
||||||
|
return {
|
||||||
|
"stress_pass": sum(1 for c in cases if c.get("status") == "PASS"),
|
||||||
|
"stress_fail": sum(1 for c in cases if c.get("status") == "FAIL"),
|
||||||
|
"stress_max_hub_rss_mb": max((c.get("hub_rss_mb", 0) or 0
|
||||||
|
for c in cases), default=0.0),
|
||||||
|
"stress_max_marte_rss_mb": max((c.get("marte_rss_mb", 0) or 0
|
||||||
|
for c in cases), default=0.0),
|
||||||
|
"stress_max_zoom_p95_ms": max((c.get("zoom_p95_ms", 0) or 0
|
||||||
|
for c in cases), default=0.0),
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
_STRESS_AXIS_METRICS = {
|
||||||
|
"ds_signal_elements": [("MARTe RSS (MB)", "marte_rss_mb"),
|
||||||
|
("hub RSS (MB)", "hub_rss_mb")],
|
||||||
|
"hub_signal_elements": [("hub RSS (MB)", "hub_rss_mb"),
|
||||||
|
("hub CPU (s)", "hub_cpu_s")],
|
||||||
|
"ds_signal_count": [("MARTe RSS (MB)", "marte_rss_mb"),
|
||||||
|
("MARTe CPU (s)", "marte_cpu_s")],
|
||||||
|
"hub_source_count": [("hub RSS (MB)", "hub_rss_mb"),
|
||||||
|
("MARTe RSS (MB)", "marte_rss_mb")],
|
||||||
|
"hub_ws_clients": [("hub RSS (MB)", "hub_rss_mb"),
|
||||||
|
("hub CPU (s)", "hub_cpu_s")],
|
||||||
|
"ds_subscriber_hubs": [("hub RSS (MB)", "hub_rss_mb"),
|
||||||
|
("MARTe CPU (s)", "marte_cpu_s")],
|
||||||
|
"hub_zoom_reqrate_hz": [("zoom p95 (ms)", "zoom_p95_ms"),
|
||||||
|
("zoom p50 (ms)", "zoom_p50_ms")],
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def stress_plots(by_axis, out):
|
||||||
|
"""One scaling-curve PNG per axis: level (x) vs the axis's metrics (y)."""
|
||||||
|
made = []
|
||||||
|
for axis, cases in by_axis.items():
|
||||||
|
series = _STRESS_AXIS_METRICS.get(
|
||||||
|
axis, [("hub RSS (MB)", "hub_rss_mb"), ("MARTe RSS (MB)", "marte_rss_mb")])
|
||||||
|
xs = [c.get("level") for c in cases]
|
||||||
|
fig, ax = plt.subplots(figsize=(7, 3))
|
||||||
|
plotted = False
|
||||||
|
for lbl, field in series:
|
||||||
|
ys = [c.get(field) for c in cases]
|
||||||
|
if all((v is None or v == 0) for v in ys):
|
||||||
|
continue
|
||||||
|
ax.plot(xs, ys, "o-", label=lbl)
|
||||||
|
plotted = True
|
||||||
|
if not plotted:
|
||||||
|
plt.close(fig)
|
||||||
|
continue
|
||||||
|
ax.set_title(f"Scaling: {axis}")
|
||||||
|
ax.set_xlabel("load level")
|
||||||
|
ax.set_ylabel("value")
|
||||||
|
ax.grid(alpha=0.3)
|
||||||
|
ax.legend(fontsize=8)
|
||||||
|
fig.tight_layout()
|
||||||
|
p = os.path.join(out, f"stress_{axis}.png")
|
||||||
|
fig.savefig(p, dpi=110)
|
||||||
|
plt.close(fig)
|
||||||
|
made.append(p)
|
||||||
|
return made
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
ap = argparse.ArgumentParser(description="Build E2E report_data.json")
|
ap = argparse.ArgumentParser(description="Build E2E report_data.json")
|
||||||
ap.add_argument("--repo", required=True)
|
ap.add_argument("--repo", required=True)
|
||||||
ap.add_argument("--results", required=True)
|
ap.add_argument("--results", required=True)
|
||||||
ap.add_argument("--work", required=True)
|
ap.add_argument("--work", required=True)
|
||||||
ap.add_argument("--out", required=True)
|
ap.add_argument("--out", required=True)
|
||||||
|
ap.add_argument("--stress-results", default=None)
|
||||||
args = ap.parse_args()
|
args = ap.parse_args()
|
||||||
os.makedirs(args.out, exist_ok=True)
|
os.makedirs(args.out, exist_ok=True)
|
||||||
|
|
||||||
@@ -250,12 +377,36 @@ def main():
|
|||||||
cov = _load(os.path.join(args.out, "coverage.json"), {"languages": []})
|
cov = _load(os.path.join(args.out, "coverage.json"), {"languages": []})
|
||||||
|
|
||||||
e2e = build_e2e(results, args.work)
|
e2e = build_e2e(results, args.work)
|
||||||
|
direct = build_by_kind(results, "direct")
|
||||||
|
recorder = build_by_kind(results, "recorder")
|
||||||
|
debug = build_by_kind(results, "debug")
|
||||||
|
tcplogger = build_by_kind(results, "tcplogger")
|
||||||
|
debug_pause_resume = build_by_kind(results, "debug_pause_resume")
|
||||||
|
|
||||||
|
stress = None
|
||||||
|
stress_plot_paths = []
|
||||||
|
if args.stress_results and os.path.exists(args.stress_results):
|
||||||
|
sr = _load(args.stress_results)
|
||||||
|
if sr:
|
||||||
|
stress = build_stress(sr)
|
||||||
|
stress_plot_paths = stress_plots(stress["by_axis"], args.out)
|
||||||
|
|
||||||
now = datetime.datetime.now()
|
now = datetime.datetime.now()
|
||||||
meta = {"timestamp": now.isoformat(timespec="seconds"),
|
meta = {"timestamp": now.isoformat(timespec="seconds"),
|
||||||
"ts_short": now.strftime("%m-%d %H:%M"),
|
"ts_short": now.strftime("%m-%d %H:%M"),
|
||||||
"git_sha": _git_sha(args.repo), "target": "x86-linux"}
|
"git_sha": _git_sha(args.repo), "target": "x86-linux"}
|
||||||
|
|
||||||
hl = headline(e2e, ut, cov)
|
hl = headline(e2e, ut, cov)
|
||||||
|
hl.update({
|
||||||
|
"direct_pass": direct["n_pass"], "direct_fail": direct["n_fail"],
|
||||||
|
"recorder_pass": recorder["n_pass"], "recorder_fail": recorder["n_fail"],
|
||||||
|
"debug_pass": debug["n_pass"], "debug_fail": debug["n_fail"],
|
||||||
|
"tcplogger_pass": tcplogger["n_pass"], "tcplogger_fail": tcplogger["n_fail"],
|
||||||
|
"debug_pause_resume_pass": debug_pause_resume["n_pass"],
|
||||||
|
"debug_pause_resume_fail": debug_pause_resume["n_fail"],
|
||||||
|
})
|
||||||
|
if stress:
|
||||||
|
hl.update(stress_headline(stress))
|
||||||
|
|
||||||
# history: read previous, then append current
|
# history: read previous, then append current
|
||||||
hist_path = os.path.join(args.out, "history.jsonl")
|
hist_path = os.path.join(args.out, "history.jsonl")
|
||||||
@@ -283,10 +434,12 @@ def main():
|
|||||||
plots = [os.path.basename(p) for p in trend_plots(history, args.out)]
|
plots = [os.path.basename(p) for p in trend_plots(history, args.out)]
|
||||||
|
|
||||||
doc = {
|
doc = {
|
||||||
"meta": meta, "e2e": e2e, "unit_tests": ut,
|
"meta": meta, "e2e": e2e, "unit_tests": ut, "coverage": cov,
|
||||||
"coverage": cov, "regression": reg, "headline": hl,
|
"direct": direct, "recorder": recorder, "debug": debug, "tcplogger": tcplogger,
|
||||||
"trend_plots": plots, "history_len": len(history),
|
"debug_pause_resume": debug_pause_resume,
|
||||||
"is_first_run": prev is None,
|
"stress": stress, "stress_plots": [os.path.basename(p) for p in stress_plot_paths],
|
||||||
|
"regression": reg, "headline": hl, "trend_plots": plots,
|
||||||
|
"history_len": len(history), "is_first_run": prev is None,
|
||||||
}
|
}
|
||||||
with open(os.path.join(args.out, "report_data.json"), "w") as f:
|
with open(os.path.join(args.out, "report_data.json"), "w") as f:
|
||||||
json.dump(doc, f, indent=2)
|
json.dump(doc, f, indent=2)
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# run_chain_e2e.sh — Full-chain E2E orchestrator for the streaming chain
|
# run_e2e.sh — Full-chain E2E orchestrator for the streaming chain
|
||||||
#
|
#
|
||||||
# MARTe2 app (FileReader -> IOGAM -> UDPStreamer)
|
# MARTe2 app (FileReader -> IOGAM -> UDPStreamer)
|
||||||
# -> UDPS -> StreamHub -> chain-client (record + zoom/window/trigger)
|
# -> UDPS -> StreamHub -> chain-client (record + zoom/window/trigger)
|
||||||
@@ -10,7 +10,9 @@
|
|||||||
# against the analytic/fed oracle, renders plots, and aggregates results.json.
|
# against the analytic/fed oracle, renders plots, and aggregates results.json.
|
||||||
# Artifacts: Build/x86-linux/E2E/chain/ (report) and /tmp/chain_e2e/ (scratch).
|
# Artifacts: Build/x86-linux/E2E/chain/ (report) and /tmp/chain_e2e/ (scratch).
|
||||||
#
|
#
|
||||||
# Usage: ./run_chain_e2e.sh [--skip-build] [--only <id>] [--pdf-only]
|
# Usage: ./run_e2e.sh [--skip-build] [--only <id>] [--pdf-only] [--cpp-coverage]
|
||||||
|
# [--skip-coverage] [--skip-stress] [--skip-datasources]
|
||||||
|
# [--skip-recorder] [--skip-debug] [--skip-tcplogger]
|
||||||
set -u
|
set -u
|
||||||
|
|
||||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
@@ -25,13 +27,24 @@ SKIP_BUILD=0
|
|||||||
ONLY=""
|
ONLY=""
|
||||||
PDF_ONLY=0
|
PDF_ONLY=0
|
||||||
CPP_COV=1
|
CPP_COV=1
|
||||||
|
SKIP_STRESS=0
|
||||||
|
SKIP_DATASOURCES=0
|
||||||
|
SKIP_RECORDER=0
|
||||||
|
SKIP_DEBUG=0
|
||||||
|
SKIP_TCPLOGGER=0
|
||||||
while [ $# -gt 0 ]; do
|
while [ $# -gt 0 ]; do
|
||||||
case "$1" in
|
case "$1" in
|
||||||
--skip-build) SKIP_BUILD=1 ;;
|
--skip-build) SKIP_BUILD=1 ;;
|
||||||
--only) shift; ONLY="$1" ;;
|
--only) shift; ONLY="$1" ;;
|
||||||
--pdf-only) PDF_ONLY=1 ;;
|
--pdf-only) PDF_ONLY=1 ;;
|
||||||
--cpp-coverage) CPP_COV=1 ;;
|
--cpp-coverage) CPP_COV=1 ;;
|
||||||
--help|-h) echo "Usage: $0 [--skip-build] [--only <id>] [--pdf-only] [--cpp-coverage]"; exit 0 ;;
|
--skip-coverage) CPP_COV=0 ;;
|
||||||
|
--skip-stress) SKIP_STRESS=1 ;;
|
||||||
|
--skip-datasources) SKIP_DATASOURCES=1 ;;
|
||||||
|
--skip-recorder) SKIP_RECORDER=1 ;;
|
||||||
|
--skip-debug) SKIP_DEBUG=1 ;;
|
||||||
|
--skip-tcplogger) SKIP_TCPLOGGER=1 ;;
|
||||||
|
--help|-h) echo "Usage: $0 [--skip-build] [--only <id>] [--pdf-only] [--cpp-coverage] [--skip-coverage] [--skip-stress] [--skip-datasources] [--skip-recorder] [--skip-debug] [--skip-tcplogger]"; exit 0 ;;
|
||||||
*) echo "unknown arg $1" >&2; exit 2 ;;
|
*) echo "unknown arg $1" >&2; exit 2 ;;
|
||||||
esac
|
esac
|
||||||
shift
|
shift
|
||||||
@@ -45,7 +58,10 @@ source "${ENV_SCRIPT}"
|
|||||||
COMP="${MARTe2_Components_DIR}/Build/${TARGET}/Components"
|
COMP="${MARTe2_Components_DIR}/Build/${TARGET}/Components"
|
||||||
export LD_LIBRARY_PATH="\
|
export LD_LIBRARY_PATH="\
|
||||||
${BUILD_DIR}/Components/DataSources/UDPStreamer:\
|
${BUILD_DIR}/Components/DataSources/UDPStreamer:\
|
||||||
|
${BUILD_DIR}/Components/DataSources/UDPStreamerClient:\
|
||||||
${BUILD_DIR}/Components/Interfaces/UDPStream:\
|
${BUILD_DIR}/Components/Interfaces/UDPStream:\
|
||||||
|
${BUILD_DIR}/Components/Interfaces/DebugService:\
|
||||||
|
${BUILD_DIR}/Components/Interfaces/TCPLogger:\
|
||||||
${MARTe2_DIR}/Build/${TARGET}/Core:\
|
${MARTe2_DIR}/Build/${TARGET}/Core:\
|
||||||
${COMP}/DataSources/LinuxTimer:\
|
${COMP}/DataSources/LinuxTimer:\
|
||||||
${COMP}/DataSources/FileDataSource:\
|
${COMP}/DataSources/FileDataSource:\
|
||||||
@@ -55,6 +71,7 @@ ${LD_LIBRARY_PATH:-}"
|
|||||||
MARTE_APP="${MARTe2_DIR}/Build/${TARGET}/App/MARTeApp.ex"
|
MARTE_APP="${MARTe2_DIR}/Build/${TARGET}/App/MARTeApp.ex"
|
||||||
STREAMHUB_EX="${BUILD_DIR}/StreamHub/StreamHub.ex"
|
STREAMHUB_EX="${BUILD_DIR}/StreamHub/StreamHub.ex"
|
||||||
CLIENT="${SCRIPT_DIR}/client/chain-client"
|
CLIENT="${SCRIPT_DIR}/client/chain-client"
|
||||||
|
DEBUGCLIENT="${SCRIPT_DIR}/debugclient/debugclient"
|
||||||
|
|
||||||
PY="python3"
|
PY="python3"
|
||||||
SCEN() { ${PY} "${SCRIPT_DIR}/scenarios.py" >/dev/null 2>&1; }
|
SCEN() { ${PY} "${SCRIPT_DIR}/scenarios.py" >/dev/null 2>&1; }
|
||||||
@@ -76,36 +93,75 @@ if [ "${SKIP_BUILD}" -eq 0 ]; then
|
|||||||
echo "── Building components ──"
|
echo "── Building components ──"
|
||||||
make -C "${REPO_ROOT}/Source/Components/Interfaces/UDPStream" -f Makefile.gcc TARGET="${TARGET}" 2>&1 | tail -1
|
make -C "${REPO_ROOT}/Source/Components/Interfaces/UDPStream" -f Makefile.gcc TARGET="${TARGET}" 2>&1 | tail -1
|
||||||
make -C "${REPO_ROOT}/Source/Components/DataSources/UDPStreamer" -f Makefile.gcc TARGET="${TARGET}" 2>&1 | tail -1
|
make -C "${REPO_ROOT}/Source/Components/DataSources/UDPStreamer" -f Makefile.gcc TARGET="${TARGET}" 2>&1 | tail -1
|
||||||
|
make -C "${REPO_ROOT}/Source/Components/DataSources/UDPStreamerClient" -f Makefile.gcc TARGET="${TARGET}" 2>&1 | tail -1
|
||||||
make -C "${REPO_ROOT}/Source/Applications/StreamHub" -f Makefile.gcc TARGET="${TARGET}" 2>&1 | tail -1
|
make -C "${REPO_ROOT}/Source/Applications/StreamHub" -f Makefile.gcc TARGET="${TARGET}" 2>&1 | tail -1
|
||||||
fi
|
fi
|
||||||
if [ ! -x "${CLIENT}" ]; then
|
if [ ! -x "${CLIENT}" ]; then
|
||||||
echo "── Building chain-client ──"
|
echo "── Building chain-client ──"
|
||||||
(cd "${SCRIPT_DIR}/client" && go build -o chain-client .) || { echo "client build failed"; exit 1; }
|
(cd "${SCRIPT_DIR}/client" && go build -o chain-client .) || { echo "client build failed"; exit 1; }
|
||||||
fi
|
fi
|
||||||
|
if [ ! -x "${DEBUGCLIENT}" ]; then
|
||||||
|
echo "── Building debugclient ──"
|
||||||
|
(cd "${SCRIPT_DIR}/debugclient" && go build -o debugclient .) || { echo "debugclient build failed"; exit 1; }
|
||||||
|
fi
|
||||||
[ -x "${MARTE_APP}" ] || { echo "ERROR: MARTeApp.ex not found at ${MARTE_APP}" >&2; exit 1; }
|
[ -x "${MARTE_APP}" ] || { echo "ERROR: MARTeApp.ex not found at ${MARTE_APP}" >&2; exit 1; }
|
||||||
[ -x "${STREAMHUB_EX}" ] || { echo "ERROR: StreamHub.ex not found" >&2; exit 1; }
|
[ -x "${STREAMHUB_EX}" ] || { echo "ERROR: StreamHub.ex not found" >&2; exit 1; }
|
||||||
|
|
||||||
# ── Scenario list (id|ws_port|udp_port0|network|oracle|trig|checks) ──────────
|
# ── Scenario list (kind|id|f2|f3|f4|f5|f6|f7) ────────────────────────────────
|
||||||
LIST="$(${PY} - "${ONLY}" <<'PY'
|
# chain: kind|id|ws_port|udp_port0|network|oracle|trig|checks
|
||||||
|
# direct: kind|id|cfg|-|-|-|-|-
|
||||||
|
# recorder: kind|id|marte_cfg|hub_cfg|-|-|-|-
|
||||||
|
# debug/tcplogger/debug_pause_resume: kind|id|cfg|cmd_port|udp_port|log_port|-|-
|
||||||
|
SKIP_KINDS=""
|
||||||
|
[ "${SKIP_DATASOURCES}" -eq 1 ] && SKIP_KINDS="${SKIP_KINDS}direct,"
|
||||||
|
[ "${SKIP_RECORDER}" -eq 1 ] && SKIP_KINDS="${SKIP_KINDS}recorder,"
|
||||||
|
[ "${SKIP_DEBUG}" -eq 1 ] && SKIP_KINDS="${SKIP_KINDS}debug,debug_pause_resume,"
|
||||||
|
[ "${SKIP_TCPLOGGER}" -eq 1 ] && SKIP_KINDS="${SKIP_KINDS}tcplogger,"
|
||||||
|
LIST="$(${PY} - "${ONLY}" "${SKIP_KINDS}" <<'PY'
|
||||||
import sys, os
|
import sys, os
|
||||||
sys.path.insert(0, os.path.dirname(os.path.abspath("Test/E2E/chain/scenarios.py")))
|
sys.path.insert(0, os.path.dirname(os.path.abspath("Test/E2E/suite/scenarios.py")))
|
||||||
sys.path.insert(0, os.path.join(os.getcwd(), "Test/E2E/chain"))
|
sys.path.insert(0, os.path.join(os.getcwd(), "Test/E2E/suite"))
|
||||||
import scenarios as S
|
import scenarios as S
|
||||||
only = sys.argv[1] if len(sys.argv) > 1 else ""
|
only = sys.argv[1] if len(sys.argv) > 1 else ""
|
||||||
|
skip_kinds = set(sys.argv[2].split(",")) if len(sys.argv) > 2 and sys.argv[2] else set()
|
||||||
for s in S.SCENARIOS:
|
for s in S.SCENARIOS:
|
||||||
if only and s["id"] != only:
|
if only and s["id"] != only:
|
||||||
continue
|
continue
|
||||||
trig = s.get("trig_signal") or ""
|
if s["kind"] in skip_kinds:
|
||||||
checks = ",".join(s.get("client_checks", []))
|
continue
|
||||||
if not trig:
|
kind = s["kind"]
|
||||||
checks = ",".join(c for c in s.get("client_checks", []) if c != "trigger")
|
if kind == "chain":
|
||||||
print("|".join([s["id"], str(s["ws_port"]), str(s["sources"][0]["udp_port"]),
|
trig = s.get("trig_signal") or ""
|
||||||
s["network"], s["oracle"], trig, checks]))
|
checks = ",".join(s.get("client_checks", []))
|
||||||
|
if not trig:
|
||||||
|
checks = ",".join(c for c in s.get("client_checks", []) if c != "trigger")
|
||||||
|
print("|".join([kind, s["id"], str(s["ws_port"]), str(s["sources"][0]["udp_port"]),
|
||||||
|
s["network"], s["oracle"], trig, checks]))
|
||||||
|
elif kind == "direct":
|
||||||
|
print("|".join([kind, s["id"], s["cfg"], "", "", "", "", ""]))
|
||||||
|
elif kind == "recorder":
|
||||||
|
print("|".join([kind, s["id"], s["marte_cfg"], s["hub_cfg"], "", "", "", ""]))
|
||||||
|
elif kind == "debug":
|
||||||
|
print("|".join([kind, s["id"], s["cfg"], str(s["cmd_port"]), str(s["udp_port"]), str(s["log_port"]), "", ""]))
|
||||||
|
elif kind == "tcplogger":
|
||||||
|
print("|".join([kind, s["id"], s["cfg"], str(s["cmd_port"]), str(s["udp_port"]), str(s["log_port"]), "", ""]))
|
||||||
|
elif kind == "debug_pause_resume":
|
||||||
|
print("|".join([kind, s["id"], s["cfg"], str(s["cmd_port"]), str(s["udp_port"]), str(s["log_port"]), "", ""]))
|
||||||
PY
|
PY
|
||||||
)"
|
)"
|
||||||
|
|
||||||
if [ -z "${LIST}" ]; then echo "no scenarios selected"; exit 1; fi
|
if [ -z "${LIST}" ]; then echo "no scenarios selected"; exit 1; fi
|
||||||
|
|
||||||
|
# run_scenario_matrix — runs the full scenario matrix (already computed into
|
||||||
|
# ${LIST}) against whatever binaries are currently built. Invoked once for the
|
||||||
|
# authoritative pass (normal binaries) and again, inside a subshell with
|
||||||
|
# OUT_DIR overridden, for the coverage-only re-run against instrumented
|
||||||
|
# binaries (see Phase 4 below). Running the coverage pass in a subshell means
|
||||||
|
# its SCEN_IDS/OUT_DIR/HUB_PID/APP_PID/trap mutations never leak back into the
|
||||||
|
# parent shell, so the primary pass's SCEN_IDS (consumed by the results.json
|
||||||
|
# aggregation step further down) is unaffected regardless of call order.
|
||||||
|
run_scenario_matrix() {
|
||||||
|
local RESULTS_SUFFIX="$1"
|
||||||
SCEN_IDS=""
|
SCEN_IDS=""
|
||||||
HUB_PID=""; APP_PID=""
|
HUB_PID=""; APP_PID=""
|
||||||
cleanup() {
|
cleanup() {
|
||||||
@@ -116,12 +172,16 @@ cleanup() {
|
|||||||
}
|
}
|
||||||
trap cleanup EXIT
|
trap cleanup EXIT
|
||||||
|
|
||||||
while IFS='|' read -r ID WSPORT UDPPORT NET ORACLE TRIG CHECKS; do
|
while IFS='|' read -r KIND ID F2 F3 F4 F5 F6 F7; do
|
||||||
[ -z "${ID}" ] && continue
|
[ -z "${ID}" ] && continue
|
||||||
SCEN_IDS="${SCEN_IDS} ${ID}"
|
SCEN_IDS="${SCEN_IDS} ${ID}"
|
||||||
|
: > "${WORK}/status_${ID}.txt"
|
||||||
|
|
||||||
|
case "${KIND}" in
|
||||||
|
chain)
|
||||||
|
WSPORT="${F2}"; UDPPORT="${F3}"; NET="${F4}"; ORACLE="${F5}"; TRIG="${F6}"; CHECKS="${F7}"
|
||||||
echo ""
|
echo ""
|
||||||
echo "══ scenario ${ID} (net=${NET} oracle=${ORACLE} ws=${WSPORT}) ══"
|
echo "══ scenario ${ID} (net=${NET} oracle=${ORACLE} ws=${WSPORT}) ══"
|
||||||
: > "${WORK}/status_${ID}.txt"
|
|
||||||
|
|
||||||
# multicast route probe
|
# multicast route probe
|
||||||
if [ "${NET}" = "multicast" ]; then
|
if [ "${NET}" = "multicast" ]; then
|
||||||
@@ -187,10 +247,133 @@ while IFS='|' read -r ID WSPORT UDPPORT NET ORACLE TRIG CHECKS; do
|
|||||||
echo "FAIL" > "${WORK}/status_${ID}.txt"
|
echo "FAIL" > "${WORK}/status_${ID}.txt"
|
||||||
fi
|
fi
|
||||||
${PY} "${SCRIPT_DIR}/plots.py" --scenario "${ID}" --dir "${WORK}" >/dev/null 2>&1 || true
|
${PY} "${SCRIPT_DIR}/plots.py" --scenario "${ID}" --dir "${WORK}" >/dev/null 2>&1 || true
|
||||||
|
;;
|
||||||
|
|
||||||
|
direct)
|
||||||
|
CFG="${F2}"
|
||||||
|
echo ""
|
||||||
|
echo "══ scenario ${ID} (kind=direct cfg=${CFG}) ══"
|
||||||
|
|
||||||
|
DS_DIR="${SCRIPT_DIR}/../datasources"
|
||||||
|
INPUT_BIN="/tmp/udpstreamer_test_input.bin"
|
||||||
|
# The FileWriterDS output path is baked into the cfg (not per-scenario);
|
||||||
|
# the last `Filename = "..."` in the file is always the writer (the
|
||||||
|
# FileReaderDS input path is always listed first in these cfgs).
|
||||||
|
OUTPUT_BIN="$(grep -oP 'Filename\s*=\s*"\K[^"]+' "${REPO_ROOT}/${CFG}" | tail -1)"
|
||||||
|
rm -f "${INPUT_BIN}" "${OUTPUT_BIN}"
|
||||||
|
(cd "${DS_DIR}" && ${PY} -c "import gen_test_data; gen_test_data.generate()") > "${OUT_DIR}/gen_${ID}.log" 2>&1
|
||||||
|
|
||||||
|
APP_LOG="${OUT_DIR}/marte_${ID}.log"
|
||||||
|
timeout 8 "${MARTE_APP}" -l RealTimeLoader -f "${REPO_ROOT}/${CFG}" -s Running > "${APP_LOG}" 2>&1 &
|
||||||
|
APP_PID=$!
|
||||||
|
sleep 5
|
||||||
|
cleanup
|
||||||
|
|
||||||
|
MSG="$(${PY} -c "
|
||||||
|
import sys
|
||||||
|
sys.path.insert(0, '${DS_DIR}')
|
||||||
|
import validate_binary as V
|
||||||
|
ok, msg, details = V.validate('${INPUT_BIN}', '${OUTPUT_BIN}', label='${ID}')
|
||||||
|
print(msg)
|
||||||
|
sys.exit(0 if ok else 1)
|
||||||
|
" 2>&1)" && STATUS=PASS || STATUS=FAIL
|
||||||
|
echo " ${MSG}"
|
||||||
|
echo "${STATUS}" > "${WORK}/status_${ID}.txt"
|
||||||
|
echo "${ID}: ${STATUS}"
|
||||||
|
;;
|
||||||
|
|
||||||
|
recorder)
|
||||||
|
RCFG_MARTE="${F2}"; RCFG_HUB="${F3}"
|
||||||
|
echo ""
|
||||||
|
echo "══ scenario ${ID} (kind=recorder marte_cfg=${RCFG_MARTE} hub_cfg=${RCFG_HUB}) ══"
|
||||||
|
|
||||||
|
DS_DIR="${SCRIPT_DIR}/../datasources"
|
||||||
|
INPUT_BIN="/tmp/udpstreamer_test_input.bin"
|
||||||
|
REC_DIR="/tmp/streamhub_rec_e2e"
|
||||||
|
rm -rf "${REC_DIR}"; mkdir -p "${REC_DIR}"
|
||||||
|
(cd "${DS_DIR}" && ${PY} -c "import gen_test_data; gen_test_data.generate()") > "${OUT_DIR}/gen_${ID}.log" 2>&1
|
||||||
|
|
||||||
|
HUB_LOG="${OUT_DIR}/hub_${ID}.log"
|
||||||
|
APP_LOG="${OUT_DIR}/marte_${ID}.log"
|
||||||
|
|
||||||
|
# Start StreamHub first so it is ready to receive the CONFIG packet.
|
||||||
|
"${STREAMHUB_EX}" -cfg "${REPO_ROOT}/${RCFG_HUB}" > "${HUB_LOG}" 2>&1 &
|
||||||
|
HUB_PID=$!
|
||||||
|
sleep 1
|
||||||
|
timeout 8 "${MARTE_APP}" -l RealTimeLoader -f "${REPO_ROOT}/${RCFG_MARTE}" -s Running > "${APP_LOG}" 2>&1 &
|
||||||
|
APP_PID=$!
|
||||||
|
|
||||||
|
# Let data flow, then stop the streamer and give the push/flush thread
|
||||||
|
# time to write the recorder file before killing the hub.
|
||||||
|
sleep 7
|
||||||
|
kill "${APP_PID}" 2>/dev/null; wait "${APP_PID}" 2>/dev/null; APP_PID=""
|
||||||
|
sleep 2
|
||||||
|
cleanup
|
||||||
|
|
||||||
|
# The recorder names files <sourceId>_<UTCstamp>_<seq>.bin; pick the newest.
|
||||||
|
REC_FILE="$(ls -t "${REC_DIR}"/*.bin 2>/dev/null | head -1)"
|
||||||
|
if [ -z "${REC_FILE}" ]; then
|
||||||
|
echo " FAIL: no recorder output file found in ${REC_DIR}"
|
||||||
|
echo "FAIL" > "${WORK}/status_${ID}.txt"
|
||||||
|
echo "${ID}: FAIL"
|
||||||
|
else
|
||||||
|
MSG="$(${PY} -c "
|
||||||
|
import sys
|
||||||
|
sys.path.insert(0, '${DS_DIR}')
|
||||||
|
import validate_binary as V
|
||||||
|
ok, msg, details = V.validate('${INPUT_BIN}', '${REC_FILE}', label='${ID}')
|
||||||
|
print(msg)
|
||||||
|
sys.exit(0 if ok else 1)
|
||||||
|
" 2>&1)" && STATUS=PASS || STATUS=FAIL
|
||||||
|
echo " ${MSG}"
|
||||||
|
echo "${STATUS}" > "${WORK}/status_${ID}.txt"
|
||||||
|
echo "${ID}: ${STATUS}"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
debug|tcplogger|debug_pause_resume)
|
||||||
|
CFG="${F2}"; CMDPORT="${F3}"; UDPPORT2="${F4}"; LOGPORT="${F5}"
|
||||||
|
echo ""
|
||||||
|
echo "══ scenario ${ID} (kind=${KIND} cfg=${CFG}) ══"
|
||||||
|
timeout 15 "${MARTE_APP}" -l RealTimeLoader -f "${REPO_ROOT}/${CFG}" -s Running \
|
||||||
|
> "${OUT_DIR}/marte_${ID}.log" 2>&1 &
|
||||||
|
APP_PID=$!
|
||||||
|
sleep 1
|
||||||
|
"${DEBUGCLIENT}" -host 127.0.0.1 \
|
||||||
|
-cmdport "${CMDPORT}" -udpport "${UDPPORT2}" -logport "${LOGPORT}" \
|
||||||
|
-mode "${KIND}" -scenario "${ID}" -out "${WORK}" -dur 4s \
|
||||||
|
> "${OUT_DIR}/client_${ID}.log" 2>&1
|
||||||
|
CLIENT_RC=$?
|
||||||
|
kill "${APP_PID}" 2>/dev/null; wait "${APP_PID}" 2>/dev/null; APP_PID=""
|
||||||
|
if [ "${CLIENT_RC}" -eq 0 ]; then
|
||||||
|
echo "PASS" > "${WORK}/status_${ID}.txt"
|
||||||
|
else
|
||||||
|
echo "FAIL" > "${WORK}/status_${ID}.txt"
|
||||||
|
fi
|
||||||
|
echo "${ID}: $(cat "${WORK}/status_${ID}.txt")"
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
echo " SKIP: unknown scenario kind '${KIND}' for ${ID}"
|
||||||
|
echo "SKIP" > "${WORK}/status_${ID}.txt"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
done <<< "${LIST}"
|
done <<< "${LIST}"
|
||||||
|
|
||||||
trap - EXIT
|
trap - EXIT
|
||||||
cleanup
|
cleanup
|
||||||
|
}
|
||||||
|
run_scenario_matrix "primary"
|
||||||
|
|
||||||
|
# ── Stress (Phase 3: normal binaries, always uninstrumented) ────────────────
|
||||||
|
if [ "${SKIP_STRESS}" -eq 0 ]; then
|
||||||
|
echo ""
|
||||||
|
echo "── Stress matrix ──"
|
||||||
|
STRESS_OUT="${OUT_DIR}/stress"
|
||||||
|
mkdir -p "${STRESS_OUT}"
|
||||||
|
${PY} "${SCRIPT_DIR}/stress_run.py" --marte "${MARTE_APP}" --hub "${STREAMHUB_EX}" \
|
||||||
|
--client "${CLIENT}" --work "/tmp/chain_stress" --out "${STRESS_OUT}" || true
|
||||||
|
fi
|
||||||
|
|
||||||
# ── Aggregate results.json ───────────────────────────────────────────────────
|
# ── Aggregate results.json ───────────────────────────────────────────────────
|
||||||
# Scenarios carrying a `known_issue` marker exercise a documented, not-yet-fixed
|
# Scenarios carrying a `known_issue` marker exercise a documented, not-yet-fixed
|
||||||
@@ -207,11 +390,13 @@ sys.path.insert(0, os.environ["SCRIPT_DIR"])
|
|||||||
try:
|
try:
|
||||||
from scenarios import SCENARIOS
|
from scenarios import SCENARIOS
|
||||||
known = {s["id"]: s.get("known_issue") for s in SCENARIOS}
|
known = {s["id"]: s.get("known_issue") for s in SCENARIOS}
|
||||||
|
kind_map = {s["id"]: s["kind"] for s in SCENARIOS}
|
||||||
except Exception:
|
except Exception:
|
||||||
known = {}
|
known = {}
|
||||||
|
kind_map = {}
|
||||||
results = []
|
results = []
|
||||||
for sid in ids:
|
for sid in ids:
|
||||||
rec = {"id": sid}
|
rec = {"id": sid, "kind": kind_map.get(sid, "chain")}
|
||||||
st = os.path.join(work, f"status_{sid}.txt")
|
st = os.path.join(work, f"status_{sid}.txt")
|
||||||
raw = open(st).read().strip() if os.path.exists(st) else "UNKNOWN"
|
raw = open(st).read().strip() if os.path.exists(st) else "UNKNOWN"
|
||||||
ki = known.get(sid)
|
ki = known.get(sid)
|
||||||
@@ -248,16 +433,44 @@ echo "── Unit tests + coverage ──"
|
|||||||
# restore a clean build so later --skip-build runs aren't left instrumented.
|
# restore a clean build so later --skip-build runs aren't left instrumented.
|
||||||
CPP_COV_FLAG=""
|
CPP_COV_FLAG=""
|
||||||
if [ "${CPP_COV}" -eq 1 ]; then
|
if [ "${CPP_COV}" -eq 1 ]; then
|
||||||
echo " building instrumented (gcov) libraries + GTest ..."
|
echo " building instrumented (gcov) libraries + apps + GTest ..."
|
||||||
COV_O="--coverage"
|
COV_O="--coverage"
|
||||||
COV_L="-Wl,--no-as-needed -fPIC --coverage"
|
COV_L="-Wl,--no-as-needed -fPIC --coverage"
|
||||||
make -C "${REPO_ROOT}" -f Makefile.gcc clean >/dev/null 2>&1 || true
|
make -C "${REPO_ROOT}" -f Makefile.gcc clean >/dev/null 2>&1 || true
|
||||||
make -C "${REPO_ROOT}" -f Makefile.gcc core TARGET="${TARGET}" \
|
# `apps` (StreamHub.ex) must be rebuilt here too, not just `core`: the
|
||||||
|
# coverage-pass E2E re-run below launches StreamHub, and `make clean` just
|
||||||
|
# removed the non-instrumented StreamHub.ex — without this it would 404 the
|
||||||
|
# WS port for every chain/recorder scenario in the coverage pass.
|
||||||
|
make -C "${REPO_ROOT}" -f Makefile.gcc core apps TARGET="${TARGET}" \
|
||||||
OPTIM="${COV_O}" LFLAGS="${COV_L}" 2>&1 | tail -1
|
OPTIM="${COV_O}" LFLAGS="${COV_L}" 2>&1 | tail -1
|
||||||
for d in Test/Components/DataSources/UDPStreamer Test/Components/DataSources/UDPStreamerClient Test/Applications/StreamHub Test/GTest Test/Integration; do
|
for d in Test/Components/DataSources/UDPStreamer Test/Components/DataSources/UDPStreamerClient Test/Applications/StreamHub Test/GTest Test/Integration; do
|
||||||
make -C "${REPO_ROOT}/${d}" -f Makefile.gcc TARGET="${TARGET}" \
|
make -C "${REPO_ROOT}/${d}" -f Makefile.gcc TARGET="${TARGET}" \
|
||||||
OPTIM="${COV_O}" LFLAGS="${COV_L}" 2>&1 | tail -1
|
OPTIM="${COV_O}" LFLAGS="${COV_L}" 2>&1 | tail -1
|
||||||
done
|
done
|
||||||
|
|
||||||
|
# Coverage-only scenario re-run: the instrumented binaries above are only
|
||||||
|
# exercised so far by collect.py's unit-test binaries (MainGTest/Integration),
|
||||||
|
# which never touch the E2E-scenario-only code paths (e.g. StreamHub code
|
||||||
|
# only hit via the direct/recorder/debug E2E flows). Re-running the full
|
||||||
|
# scenario matrix here — against the SAME instrumented binaries, before
|
||||||
|
# collect.py's lcov capture — lets those .gcda files accumulate E2E-path
|
||||||
|
# coverage too. Run in a subshell with OUT_DIR *and* WORK overridden so the
|
||||||
|
# coverage pass's logs/results/perf-JSON/waveform-PNG scratch files land in
|
||||||
|
# discardable subdirectories and none of its SCEN_IDS/OUT_DIR/WORK/trap
|
||||||
|
# state leaks back into this shell (the authoritative results.json was
|
||||||
|
# already written above, from the primary pass). WORK must be isolated too,
|
||||||
|
# not just OUT_DIR: run_scenario_matrix writes perf_*/wave_*.png/metrics_*
|
||||||
|
# under WORK, and report_build.py reads those files straight from WORK
|
||||||
|
# after this pass — without isolation the coverage-instrumented re-run
|
||||||
|
# would silently clobber the primary pass's perf/waveform data.
|
||||||
|
echo " re-running scenario matrix under instrumented binaries (coverage pass) ..."
|
||||||
|
(
|
||||||
|
OUT_DIR="${OUT_DIR}/coverage_pass"
|
||||||
|
WORK="${WORK}/coverage_pass"
|
||||||
|
mkdir -p "${OUT_DIR}" "${WORK}"
|
||||||
|
run_scenario_matrix "coverage"
|
||||||
|
) || true
|
||||||
|
|
||||||
CPP_COV_FLAG="--cpp-coverage"
|
CPP_COV_FLAG="--cpp-coverage"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -267,13 +480,19 @@ ${PY} "${SCRIPT_DIR}/collect.py" --repo "${REPO_ROOT}" --target "${TARGET}" \
|
|||||||
if [ "${CPP_COV}" -eq 1 ]; then
|
if [ "${CPP_COV}" -eq 1 ]; then
|
||||||
echo " restoring non-instrumented build ..."
|
echo " restoring non-instrumented build ..."
|
||||||
make -C "${REPO_ROOT}" -f Makefile.gcc clean >/dev/null 2>&1 || true
|
make -C "${REPO_ROOT}" -f Makefile.gcc clean >/dev/null 2>&1 || true
|
||||||
make -C "${REPO_ROOT}" -f Makefile.gcc core apps TARGET="${TARGET}" 2>&1 | tail -1
|
# `clean` also wipes Test/GTest, Test/Integration and Test/Components/* (see
|
||||||
|
# the root Makefile.gcc `clean` target), so `test` must be rebuilt here too,
|
||||||
|
# not just `core apps` — otherwise MainGTest.ex/IntegrationTests.ex are left
|
||||||
|
# deleted (instrumented-only) after every --cpp-coverage run.
|
||||||
|
make -C "${REPO_ROOT}" -f Makefile.gcc core apps test TARGET="${TARGET}" 2>&1 | tail -1
|
||||||
(cd "${SCRIPT_DIR}/client" && go build -o chain-client . >/dev/null 2>&1) || true
|
(cd "${SCRIPT_DIR}/client" && go build -o chain-client . >/dev/null 2>&1) || true
|
||||||
|
(cd "${SCRIPT_DIR}/debugclient" && go build -o debugclient . >/dev/null 2>&1) || true
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# ── Consolidated report data (+ history/regression + trend plots) ────────────
|
# ── Consolidated report data (+ history/regression + trend plots) ────────────
|
||||||
${PY} "${SCRIPT_DIR}/report_build.py" --repo "${REPO_ROOT}" \
|
${PY} "${SCRIPT_DIR}/report_build.py" --repo "${REPO_ROOT}" \
|
||||||
--results "${OUT_DIR}/results.json" --work "${WORK}" --out "${OUT_DIR}" || true
|
--results "${OUT_DIR}/results.json" --work "${WORK}" --out "${OUT_DIR}" \
|
||||||
|
--stress-results "${OUT_DIR}/stress/stress_results.json" || true
|
||||||
|
|
||||||
# ── PDF ──────────────────────────────────────────────────────────────────────
|
# ── PDF ──────────────────────────────────────────────────────────────────────
|
||||||
if command -v typst >/dev/null 2>&1 && [ -f "${SCRIPT_DIR}/E2E_Report.typ" ]; then
|
if command -v typst >/dev/null 2>&1 && [ -f "${SCRIPT_DIR}/E2E_Report.typ" ]; then
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
# It sweeps one load axis at a time (signal size/count, subscriber fan-out, source
|
# It sweeps one load axis at a time (signal size/count, subscriber fan-out, source
|
||||||
# count, WS-client count, zoom request rate — see stress.py) and gates each case on
|
# count, WS-client count, zoom request rate — see stress.py) and gates each case on
|
||||||
# survival + liveness (hard) and RSS + zoom-p95 latency (soft). This is the
|
# survival + liveness (hard) and RSS + zoom-p95 latency (soft). This is the
|
||||||
# capacity sibling of run_chain_e2e.sh (which gates waveform correctness).
|
# capacity sibling of run_e2e.sh (which gates waveform correctness).
|
||||||
#
|
#
|
||||||
# Usage: ./run_stress.sh [--skip-build] [--only <id>] [--axis <axis>]
|
# Usage: ./run_stress.sh [--skip-build] [--only <id>] [--axis <axis>]
|
||||||
set -u
|
set -u
|
||||||
@@ -135,6 +135,22 @@ def _sig(name, type, elements=1, time_mode="PacketTime", time_signal=None,
|
|||||||
def validate_scenario(s):
|
def validate_scenario(s):
|
||||||
"""Return a list of validity error strings (empty == valid)."""
|
"""Return a list of validity error strings (empty == valid)."""
|
||||||
errs = []
|
errs = []
|
||||||
|
kind = s.get("kind", "chain")
|
||||||
|
if kind == "direct":
|
||||||
|
if "cfg" not in s:
|
||||||
|
errs.append(f"direct scenario {s.get('id')} missing cfg")
|
||||||
|
return errs
|
||||||
|
if kind == "recorder":
|
||||||
|
if "hub_cfg" not in s or "marte_cfg" not in s:
|
||||||
|
errs.append(f"recorder scenario {s.get('id')} missing hub_cfg/marte_cfg")
|
||||||
|
return errs
|
||||||
|
if kind in ("debug", "tcplogger", "debug_pause_resume"):
|
||||||
|
if not all(k in s for k in ("cfg", "cmd_port", "udp_port", "log_port")):
|
||||||
|
errs.append(f"{kind} scenario {s.get('id')} missing cfg/cmd_port/udp_port/log_port")
|
||||||
|
return errs
|
||||||
|
if kind != "chain":
|
||||||
|
errs.append(f"unknown scenario kind: {kind}")
|
||||||
|
return errs
|
||||||
row_dt, num_rows, _producer_hz, loop_hz = geometry(s)
|
row_dt, num_rows, _producer_hz, loop_hz = geometry(s)
|
||||||
if s.get("network") not in ("unicast", "multicast"):
|
if s.get("network") not in ("unicast", "multicast"):
|
||||||
errs.append("network must be unicast|multicast")
|
errs.append("network must be unicast|multicast")
|
||||||
@@ -565,6 +581,84 @@ SCENARIOS = (_STARTERS + _TYPES + _ARRAYS + _TIMEMODES + _QUANT + _PUBLISH +
|
|||||||
_PAYLOAD + _MCAST + _MULTISRC + _INTERACT + _TRIGGER + _MISC +
|
_PAYLOAD + _MCAST + _MULTISRC + _INTERACT + _TRIGGER + _MISC +
|
||||||
_HIGHRATE)
|
_HIGHRATE)
|
||||||
|
|
||||||
|
for _s in SCENARIOS:
|
||||||
|
_s.setdefault("kind", "chain")
|
||||||
|
|
||||||
|
# ── Non-chain scenario kinds ──────────────────────────────────────────────────
|
||||||
|
# "direct" and "recorder" scenarios exercise the other two data paths described
|
||||||
|
# in ARCHITECTURE.md (direct UDPStreamer<->UDPStreamerClient, and StreamHub's
|
||||||
|
# BinaryRecorder disk sink) and intentionally do not carry the chain-only keys
|
||||||
|
# (sources/network/oracle/...): they have their own orchestration in run_e2e.sh.
|
||||||
|
_DIRECT = [
|
||||||
|
{
|
||||||
|
"id": "s52_direct_unicast",
|
||||||
|
"desc": "Direct UDPStreamer->UDPStreamerClient round-trip, unicast",
|
||||||
|
"kind": "direct",
|
||||||
|
"cfg": "Test/E2E/datasources/E2ETest.cfg",
|
||||||
|
"client_checks": [],
|
||||||
|
"known_issue": None,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "s53_direct_multicast",
|
||||||
|
"desc": "Direct UDPStreamer->UDPStreamerClient round-trip, multicast",
|
||||||
|
"kind": "direct",
|
||||||
|
"cfg": "Test/E2E/datasources/E2EMulticastTest.cfg",
|
||||||
|
"client_checks": [],
|
||||||
|
"known_issue": None,
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
_RECORDER = [
|
||||||
|
{
|
||||||
|
"id": "s54_recorder",
|
||||||
|
"desc": "StreamHub BinaryRecorder disk-output round-trip",
|
||||||
|
"kind": "recorder",
|
||||||
|
"hub_cfg": "Test/E2E/recorder/StreamHubRec.cfg",
|
||||||
|
"marte_cfg": "Test/E2E/recorder/RecorderStreamer.cfg",
|
||||||
|
"client_checks": [],
|
||||||
|
"known_issue": None,
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
_DEBUG = [
|
||||||
|
{
|
||||||
|
"id": "s55_debug_force_trace_break",
|
||||||
|
"desc": "DebugService FORCE/TRACE/BREAK over real TCP 8080 + UDP 8081",
|
||||||
|
"kind": "debug",
|
||||||
|
"cfg": "Test/E2E/suite/debug_e2e.cfg",
|
||||||
|
"cmd_port": 8080, "udp_port": 8081, "log_port": 9090,
|
||||||
|
"client_checks": [],
|
||||||
|
"known_issue": None,
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
_TCPLOGGER = [
|
||||||
|
{
|
||||||
|
"id": "s56_tcplogger_delivery",
|
||||||
|
"desc": "TCPLogger delivers a log line for a triggered DebugService event",
|
||||||
|
"kind": "tcplogger",
|
||||||
|
"cfg": "Test/E2E/suite/debug_e2e.cfg",
|
||||||
|
"cmd_port": 8080, "udp_port": 8081, "log_port": 9090,
|
||||||
|
"client_checks": [],
|
||||||
|
"known_issue": None,
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
_DEBUG_PAUSE_RESUME = [
|
||||||
|
{
|
||||||
|
"id": "s57_debug_pause_resume",
|
||||||
|
"desc": "DebugService PAUSE/RESUME halts and resumes the RT loop, "
|
||||||
|
"verified via live VALUE polling (not just command acks)",
|
||||||
|
"kind": "debug_pause_resume",
|
||||||
|
"cfg": "Test/E2E/suite/debug_e2e.cfg",
|
||||||
|
"cmd_port": 8080, "udp_port": 8081, "log_port": 9090,
|
||||||
|
"client_checks": [],
|
||||||
|
"known_issue": None,
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
SCENARIOS = SCENARIOS + _DIRECT + _RECORDER + _DEBUG + _TCPLOGGER + _DEBUG_PAUSE_RESUME
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
import sys
|
import sys
|
||||||
@@ -576,13 +670,14 @@ if __name__ == "__main__":
|
|||||||
if s["id"] in seen_ids:
|
if s["id"] in seen_ids:
|
||||||
errs.append("duplicate id")
|
errs.append("duplicate id")
|
||||||
seen_ids.add(s["id"])
|
seen_ids.add(s["id"])
|
||||||
if s["ws_port"] in seen_ws:
|
if s["kind"] == "chain":
|
||||||
errs.append(f"duplicate ws_port {s['ws_port']}")
|
if s["ws_port"] in seen_ws:
|
||||||
seen_ws.add(s["ws_port"])
|
errs.append(f"duplicate ws_port {s['ws_port']}")
|
||||||
for src in s["sources"]:
|
seen_ws.add(s["ws_port"])
|
||||||
if src["udp_port"] in seen_udp:
|
for src in s["sources"]:
|
||||||
errs.append(f"duplicate udp_port {src['udp_port']}")
|
if src["udp_port"] in seen_udp:
|
||||||
seen_udp.add(src["udp_port"])
|
errs.append(f"duplicate udp_port {src['udp_port']}")
|
||||||
|
seen_udp.add(src["udp_port"])
|
||||||
print(f"{s['id']:32s} {'OK' if not errs else errs}")
|
print(f"{s['id']:32s} {'OK' if not errs else errs}")
|
||||||
ok = ok and not errs
|
ok = ok and not errs
|
||||||
print(f"\n{len(SCENARIOS)} scenarios, {'ALL VALID' if ok else 'INVALID PRESENT'}")
|
print(f"\n{len(SCENARIOS)} scenarios, {'ALL VALID' if ok else 'INVALID PRESENT'}")
|
||||||
@@ -41,10 +41,11 @@ gen_data.py / gen_cfg.py generators consume it unchanged):
|
|||||||
"max_hub_rss_mb": float, "max_zoom_p95_ms": float },
|
"max_hub_rss_mb": float, "max_zoom_p95_ms": float },
|
||||||
} }
|
} }
|
||||||
|
|
||||||
The matrix keeps every datagram a single UDP fragment (payload < 64 KB): the
|
The matrix keeps every datagram a single UDP fragment for the count/rate axes, but
|
||||||
UDPSClient reassembly buffer caps a deliverable packet at ~64 KB, so sustained
|
the *size* axis deliberately crosses the 64 KB single-datagram boundary into the
|
||||||
high-rate streaming must stay below it (see scenarios.py s51). Cases therefore
|
multi-fragment regime: the UDPSClient reassembles up to UDPS_CLIENT_MAX_PACKET_BYTES
|
||||||
sweep *count* and *rate*, not oversized single packets.
|
(1 MiB) per packet, so the size sweep runs to ~954 KB packets to exercise that path
|
||||||
|
under load.
|
||||||
"""
|
"""
|
||||||
import itertools
|
import itertools
|
||||||
|
|
||||||
@@ -59,6 +60,12 @@ _data = itertools.count(46000, 2)
|
|||||||
# float32 arrays sized so one cycle's array is a single sub-64 KB datagram.
|
# float32 arrays sized so one cycle's array is a single sub-64 KB datagram.
|
||||||
F32 = "float32"
|
F32 = "float32"
|
||||||
|
|
||||||
|
# Deliverable-packet cap mirrored verbatim from
|
||||||
|
# Source/Components/Interfaces/UDPStream/UDPSClient.h
|
||||||
|
# (UDPS_CLIENT_MAX_PACKET_BYTES). A single source's reassembled DATA payload must
|
||||||
|
# stay under this; the UDPStreamer still fragments it into MaxPayloadSize chunks.
|
||||||
|
UDPS_CLIENT_MAX_PACKET_BYTES = 1048576 # 1 MiB
|
||||||
|
|
||||||
|
|
||||||
def _f32_arr(name, elements, sampling_rate=1.0e6):
|
def _f32_arr(name, elements, sampling_rate=1.0e6):
|
||||||
"""A float32 array signal timestamped FirstSample off the shared ns anchor.
|
"""A float32 array signal timestamped FirstSample off the shared ns anchor.
|
||||||
@@ -70,12 +77,13 @@ def _f32_arr(name, elements, sampling_rate=1.0e6):
|
|||||||
time_signal="Tns", sampling_rate=sampling_rate, formula="ramp")
|
time_signal="Tns", sampling_rate=sampling_rate, formula="ramp")
|
||||||
|
|
||||||
|
|
||||||
def _source(sid, n_signals, elements, multicast=False):
|
def _source(sid, n_signals, elements, multicast=False, row_dt=S.ROW_DT):
|
||||||
"""One UDPStreamer source: a uint64 ns anchor + n_signals float32 arrays.
|
"""One UDPStreamer source: a uint64 ns anchor + n_signals float32 arrays.
|
||||||
|
|
||||||
sampling_rate = elements / row_dt(1 ms) = elements * 1000 keeps each array's
|
sampling_rate = elements / row_dt keeps each array's per-cycle window equal to
|
||||||
1 ms window aligned to the 1 kHz cycle regardless of `elements`."""
|
one producer cycle (the First/LastSample monotonic-ring constraint) regardless
|
||||||
rate = elements * 1000.0
|
of `elements` or a slowed-down producer."""
|
||||||
|
rate = elements / row_dt
|
||||||
sigs = [S._sig("Tns", "uint64", 1, unit="ns", formula="time_ns",
|
sigs = [S._sig("Tns", "uint64", 1, unit="ns", formula="time_ns",
|
||||||
is_time=True)]
|
is_time=True)]
|
||||||
sigs += [_f32_arr(f"S{i}", elements, rate) for i in range(n_signals)]
|
sigs += [_f32_arr(f"S{i}", elements, rate) for i in range(n_signals)]
|
||||||
@@ -94,7 +102,8 @@ def _packet_bytes(n_signals, elements):
|
|||||||
|
|
||||||
def mk_stress(sid, axis, level, sources, shape="hub", clients=1, hubs=1,
|
def mk_stress(sid, axis, level, sources, shape="hub", clients=1, hubs=1,
|
||||||
reqrate=0.0, dur=6.0, network="unicast", publishing="Strict",
|
reqrate=0.0, dur=6.0, network="unicast", publishing="Strict",
|
||||||
ratio=None, min_refresh_hz=None, gate=None):
|
ratio=None, min_refresh_hz=None, gate=None,
|
||||||
|
row_dt=None, num_rows=None, producer_hz=None):
|
||||||
case = {
|
case = {
|
||||||
"id": sid, "desc": f"stress {axis}={level}",
|
"id": sid, "desc": f"stress {axis}={level}",
|
||||||
"network": network, "publishing": publishing,
|
"network": network, "publishing": publishing,
|
||||||
@@ -103,7 +112,7 @@ def mk_stress(sid, axis, level, sources, shape="hub", clients=1, hubs=1,
|
|||||||
"ws_port": next(_ws), "sources": sources,
|
"ws_port": next(_ws), "sources": sources,
|
||||||
"oracle": "analytic", "client_checks": ["live", "zoom"],
|
"oracle": "analytic", "client_checks": ["live", "zoom"],
|
||||||
"trig_signal": None, "known_issue": None,
|
"trig_signal": None, "known_issue": None,
|
||||||
"row_dt": None, "num_rows": None, "producer_hz": None,
|
"row_dt": row_dt, "num_rows": num_rows, "producer_hz": producer_hz,
|
||||||
"shape": shape,
|
"shape": shape,
|
||||||
"stress": {
|
"stress": {
|
||||||
"axis": axis, "level": level, "clients": clients, "hubs": hubs,
|
"axis": axis, "level": level, "clients": clients, "hubs": hubs,
|
||||||
@@ -125,11 +134,27 @@ def _gate(min_frames=5, marte_rss=512.0, hub_rss=1024.0, zoom_p95=1000.0):
|
|||||||
# Single source + single hub; the load lands on the UDPStreamer serialise/send
|
# Single source + single hub; the load lands on the UDPStreamer serialise/send
|
||||||
# path and is read back through one WS client (proc_perf measures marte).
|
# path and is read back through one WS client (proc_perf measures marte).
|
||||||
|
|
||||||
# size: one float32 array, growing element count → bigger single-datagram packet.
|
# size: one float32 array, growing element count → bigger packet.
|
||||||
_DS_SIZE = [
|
_DS_SIZE = [
|
||||||
mk_stress(f"ds_size_{e}", "ds_signal_elements", e,
|
mk_stress(f"ds_size_{e}", "ds_signal_elements", e,
|
||||||
[_source("src", 1, e)], gate=_gate())
|
[_source("src", 1, e)], gate=_gate())
|
||||||
for e in (1000, 4000, 8000, 15000) # 4 KB → 60 KB packets (sub-64 KB cap)
|
for e in (1000, 4000, 8000, 15000) # 4 KB → 60 KB packets (original single-datagram cases)
|
||||||
|
]
|
||||||
|
|
||||||
|
# Multi-fragment size cases: one float32 array large enough that the DATA packet
|
||||||
|
# spans several UDP datagrams (>64 KB), exercising the UDPSClient reassembly path
|
||||||
|
# (cap 1 MiB). A slowed-down producer keeps bandwidth realistic:
|
||||||
|
# 50k≈195 KB @100 Hz≈20 MB/s, 100k≈390 KB @100 Hz≈39 MB/s, 250k≈954 KB @50 Hz≈48 MB/s.
|
||||||
|
# row_dt sets the producer cycle so the FirstSample window equals one cycle; a small
|
||||||
|
# num_rows keeps the FileReader input file bounded (50*250k*4 ≈ 50 MB).
|
||||||
|
_BIG_SIZE = [(50000, 0.01, 100), (100000, 0.01, 100), (250000, 0.02, 50)]
|
||||||
|
|
||||||
|
_DS_SIZE += [
|
||||||
|
mk_stress(f"ds_size_{e}", "ds_signal_elements", e,
|
||||||
|
[_source("src", 1, e, row_dt=rdt)],
|
||||||
|
row_dt=rdt, num_rows=50, producer_hz=phz,
|
||||||
|
gate=_gate(marte_rss=1024.0, hub_rss=2048.0))
|
||||||
|
for (e, rdt, phz) in _BIG_SIZE
|
||||||
]
|
]
|
||||||
|
|
||||||
# count: many 1000-element float32 arrays in one source → wider packet + more
|
# count: many 1000-element float32 arrays in one source → wider packet + more
|
||||||
@@ -137,7 +162,7 @@ _DS_SIZE = [
|
|||||||
_DS_COUNT = [
|
_DS_COUNT = [
|
||||||
mk_stress(f"ds_count_{n}", "ds_signal_count", n,
|
mk_stress(f"ds_count_{n}", "ds_signal_count", n,
|
||||||
[_source("src", n, 1000)], gate=_gate())
|
[_source("src", n, 1000)], gate=_gate())
|
||||||
for n in (1, 4, 8, 15) # 15*4 KB ≈ 60 KB packet (sub-64 KB cap)
|
for n in (1, 4, 8, 15) # 15*4 KB ≈ 60 KB packet (original single-datagram case)
|
||||||
]
|
]
|
||||||
|
|
||||||
# clients (fan-out): one source, M subscriber hubs (ds_fanout shape). The
|
# clients (fan-out): one source, M subscriber hubs (ds_fanout shape). The
|
||||||
@@ -160,6 +185,14 @@ _HUB_SIZE = [
|
|||||||
for e in (1000, 4000, 8000, 15000)
|
for e in (1000, 4000, 8000, 15000)
|
||||||
]
|
]
|
||||||
|
|
||||||
|
_HUB_SIZE += [
|
||||||
|
mk_stress(f"hub_size_{e}", "hub_signal_elements", e,
|
||||||
|
[_source("src", 1, e, row_dt=rdt)],
|
||||||
|
row_dt=rdt, num_rows=50, producer_hz=phz,
|
||||||
|
gate=_gate(marte_rss=1024.0, hub_rss=2048.0))
|
||||||
|
for (e, rdt, phz) in _BIG_SIZE
|
||||||
|
]
|
||||||
|
|
||||||
# sources: N independent UDPStreamer feeds into one hub (each its own udp_port).
|
# sources: N independent UDPStreamer feeds into one hub (each its own udp_port).
|
||||||
_HUB_SOURCES = [
|
_HUB_SOURCES = [
|
||||||
mk_stress(f"hub_sources_{n}", "hub_source_count", n,
|
mk_stress(f"hub_sources_{n}", "hub_source_count", n,
|
||||||
@@ -198,16 +231,18 @@ def validate_case(c):
|
|||||||
f"(UDPStreamer max unicast clients)")
|
f"(UDPStreamer max unicast clients)")
|
||||||
if c["shape"] == "hub" and (st["clients"] < 1):
|
if c["shape"] == "hub" and (st["clients"] < 1):
|
||||||
errs.append(f"{c['id']}: hub clients must be >= 1")
|
errs.append(f"{c['id']}: hub clients must be >= 1")
|
||||||
# Single-datagram ceiling: keep each source's packet < 64 KB so it never
|
# Enforce 1 MiB deliverable cap (UDPS_CLIENT_MAX_PACKET_BYTES): each source's
|
||||||
# needs reassembly (the deliverable-packet cap).
|
# reassembled DATA payload must stay under this. Note: the size axis includes
|
||||||
|
# multi-fragment cases that intentionally exceed 64 KB (reassembled by UDPSClient).
|
||||||
for src in c["sources"]:
|
for src in c["sources"]:
|
||||||
n_data = sum(1 for s in src["signals"] if not s["is_time"])
|
n_data = sum(1 for s in src["signals"] if not s["is_time"])
|
||||||
elem = max((s["elements"] for s in src["signals"]
|
elem = max((s["elements"] for s in src["signals"]
|
||||||
if not s["is_time"]), default=0)
|
if not s["is_time"]), default=0)
|
||||||
pb = _packet_bytes(n_data, elem)
|
pb = _packet_bytes(n_data, elem)
|
||||||
if pb >= 65536:
|
if pb >= UDPS_CLIENT_MAX_PACKET_BYTES:
|
||||||
errs.append(f"{c['id']}: source {src['id']} packet {pb} B exceeds "
|
errs.append(f"{c['id']}: source {src['id']} packet {pb} B exceeds "
|
||||||
f"the 64 KB single-datagram cap")
|
f"the {UDPS_CLIENT_MAX_PACKET_BYTES} B deliverable cap "
|
||||||
|
f"(UDPS_CLIENT_MAX_PACKET_BYTES)")
|
||||||
return errs
|
return errs
|
||||||
|
|
||||||
|
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
"""
|
"""
|
||||||
stress_run.py — Orchestrator for the streaming-chain stress matrix (stress.py).
|
stress_run.py — Orchestrator for the streaming-chain stress matrix (stress.py).
|
||||||
|
|
||||||
Where run_chain_e2e.sh drives scenarios.py for *correctness*, this drives
|
Where run_e2e.sh drives scenarios.py for *correctness*, this drives
|
||||||
STRESS_CASES for *capacity*. Per case it:
|
STRESS_CASES for *capacity*. Per case it:
|
||||||
|
|
||||||
1. generates the FileReader input + MARTe app cfg + 1..M StreamHub cfgs
|
1. generates the FileReader input + MARTe app cfg + 1..M StreamHub cfgs
|
||||||
@@ -58,6 +58,45 @@ class TestScenarios(unittest.TestCase):
|
|||||||
errs = S.validate_scenario(s)
|
errs = S.validate_scenario(s)
|
||||||
self.assertTrue(any("quant only on float" in e for e in errs), errs)
|
self.assertTrue(any("quant only on float" in e for e in errs), errs)
|
||||||
|
|
||||||
|
def test_all_scenarios_have_kind(self):
|
||||||
|
for s in S.SCENARIOS:
|
||||||
|
self.assertIn("kind", s, f"{s['id']} missing kind")
|
||||||
|
self.assertIn(s["kind"], ("chain", "direct", "recorder", "debug", "tcplogger", "debug_pause_resume"))
|
||||||
|
|
||||||
|
def test_direct_and_recorder_scenarios_present(self):
|
||||||
|
kinds = {s["kind"] for s in S.SCENARIOS}
|
||||||
|
self.assertIn("direct", kinds)
|
||||||
|
self.assertIn("recorder", kinds)
|
||||||
|
direct_ids = {s["id"] for s in S.SCENARIOS if s["kind"] == "direct"}
|
||||||
|
self.assertEqual(direct_ids, {"s52_direct_unicast", "s53_direct_multicast"})
|
||||||
|
recorder_ids = {s["id"] for s in S.SCENARIOS if s["kind"] == "recorder"}
|
||||||
|
self.assertEqual(recorder_ids, {"s54_recorder"})
|
||||||
|
|
||||||
|
def test_validate_scenario_accepts_all_kinds(self):
|
||||||
|
for s in S.SCENARIOS:
|
||||||
|
S.validate_scenario(s) # must not raise
|
||||||
|
|
||||||
|
def test_debug_and_tcplogger_scenarios_present(self):
|
||||||
|
kinds = {s["kind"] for s in S.SCENARIOS}
|
||||||
|
self.assertIn("debug", kinds)
|
||||||
|
self.assertIn("tcplogger", kinds)
|
||||||
|
debug_ids = {s["id"] for s in S.SCENARIOS if s["kind"] == "debug"}
|
||||||
|
self.assertEqual(debug_ids, {"s55_debug_force_trace_break"})
|
||||||
|
tcplogger_ids = {s["id"] for s in S.SCENARIOS if s["kind"] == "tcplogger"}
|
||||||
|
self.assertEqual(tcplogger_ids, {"s56_tcplogger_delivery"})
|
||||||
|
|
||||||
|
def test_build_by_kind_filters_correctly(self):
|
||||||
|
import report_build as R
|
||||||
|
results = {"scenarios": [
|
||||||
|
{"id": "a", "kind": "direct", "status": "PASS"},
|
||||||
|
{"id": "b", "kind": "chain", "status": "PASS"},
|
||||||
|
{"id": "c", "kind": "direct", "status": "FAIL"},
|
||||||
|
]}
|
||||||
|
d = R.build_by_kind(results, "direct")
|
||||||
|
self.assertEqual(d["n_pass"], 1)
|
||||||
|
self.assertEqual(d["n_fail"], 1)
|
||||||
|
self.assertEqual(d["n_total"], 2)
|
||||||
|
|
||||||
|
|
||||||
class TestGenData(unittest.TestCase):
|
class TestGenData(unittest.TestCase):
|
||||||
def test_ground_truth_shapes(self):
|
def test_ground_truth_shapes(self):
|
||||||
@@ -166,6 +166,28 @@ def sine_shape(t, v, freq):
|
|||||||
return corr, nrmse, amp
|
return corr, nrmse, amp
|
||||||
|
|
||||||
|
|
||||||
|
def best_sine_shape(t, v, freq_nominal, band=0.05, n=41):
|
||||||
|
"""Refine ``freq_nominal`` within +/-``band`` (fractional) before fitting.
|
||||||
|
|
||||||
|
The gross-sanity gate assumes the nominal configured frequency, but
|
||||||
|
MARTe2's LinuxTimer RT loop runs at a small, systematic offset from true
|
||||||
|
wall-clock time (a few percent at most), which accumulates into visible
|
||||||
|
phase drift over a multi-second capture even though every sample value is
|
||||||
|
bit-correct. A coarse search for the actual best-fit frequency near the
|
||||||
|
nominal value absorbs that clock-rate skew while still rejecting a
|
||||||
|
genuinely wrong-frequency or corrupted signal, which collapses correlation
|
||||||
|
regardless of the search window. Returns (corr, nrmse, amp, freq_used).
|
||||||
|
"""
|
||||||
|
candidates = np.linspace(freq_nominal * (1.0 - band),
|
||||||
|
freq_nominal * (1.0 + band), n)
|
||||||
|
best = None
|
||||||
|
for f in candidates:
|
||||||
|
corr, nrmse, amp = sine_shape(t, v, f)
|
||||||
|
if best is None or corr > best[0]:
|
||||||
|
best = (corr, nrmse, amp, float(f))
|
||||||
|
return best
|
||||||
|
|
||||||
|
|
||||||
def compare_signal(gt, t_recv, v_recv, tap_v=None):
|
def compare_signal(gt, t_recv, v_recv, tap_v=None):
|
||||||
tol, step = _tol(gt)
|
tol, step = _tol(gt)
|
||||||
truth_v = gt["v"].astype(np.float64)
|
truth_v = gt["v"].astype(np.float64)
|
||||||
@@ -193,7 +215,15 @@ def compare_signal(gt, t_recv, v_recv, tap_v=None):
|
|||||||
|
|
||||||
shape_ok = True
|
shape_ok = True
|
||||||
if gt["formula"] == "sine" and v_recv.size >= 8 and gt["freq"]:
|
if gt["formula"] == "sine" and v_recv.size >= 8 and gt["freq"]:
|
||||||
corr, nrmse, amp = sine_shape(t_recv, v_recv, gt["freq"])
|
# Refine the fit frequency within +/-5% of nominal before scoring:
|
||||||
|
# MARTe2's LinuxTimer RT loop runs at a small, systematic offset from
|
||||||
|
# true wall-clock time (a few percent), which accumulates into
|
||||||
|
# visible phase drift over a multi-second capture even though every
|
||||||
|
# sample value is bit-correct (see best_sine_shape docstring). This
|
||||||
|
# keeps the gate a *gross frequency-sanity* check — a wrong-frequency
|
||||||
|
# or corrupted signal still collapses corr regardless of the search
|
||||||
|
# window — while absorbing legitimate clock-rate skew.
|
||||||
|
corr, nrmse, amp, freq_fit = best_sine_shape(t_recv, v_recv, gt["freq"])
|
||||||
# Shape is a *gross frequency-sanity gate* plus a *tracked quality
|
# Shape is a *gross frequency-sanity gate* plus a *tracked quality
|
||||||
# metric*, not a tight correctness gate. Signal values are bit-faithful
|
# metric*, not a tight correctness gate. Signal values are bit-faithful
|
||||||
# (the fidelity oracle proves that); the gap from a perfect fit is
|
# (the fidelity oracle proves that); the gap from a perfect fit is
|
||||||
@@ -208,7 +238,7 @@ def compare_signal(gt, t_recv, v_recv, tap_v=None):
|
|||||||
nrmse_tol = 0.30 + (step / (gt["range_max"] - gt["range_min"])
|
nrmse_tol = 0.30 + (step / (gt["range_max"] - gt["range_min"])
|
||||||
if gt["quant"] != "none" else 0.0)
|
if gt["quant"] != "none" else 0.0)
|
||||||
shape_ok = corr >= 0.5 and nrmse <= nrmse_tol
|
shape_ok = corr >= 0.5 and nrmse <= nrmse_tol
|
||||||
m.update(corr=corr, nrmse=nrmse, amp_fit=amp,
|
m.update(corr=corr, nrmse=nrmse, amp_fit=amp, freq_fit=freq_fit,
|
||||||
nrmse_tol=nrmse_tol, shape_ok=bool(shape_ok),
|
nrmse_tol=nrmse_tol, shape_ok=bool(shape_ok),
|
||||||
shape_gate="gross")
|
shape_gate="gross")
|
||||||
|
|
||||||
@@ -0,0 +1,197 @@
|
|||||||
|
../../Build/x86-linux//GTest/DebugServiceGTest.o: DebugServiceGTest.cpp \
|
||||||
|
../../Source/Components/Interfaces/DebugService/DebugCore.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Architecture/x86_gcc/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TypeDescriptor.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BasicType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/FractionalInteger.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TypeCharacteristics.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TemplateParametersVerificator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitRange.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitBoolean.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/StreamString.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TypeCharacteristics.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HeapManager.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HeapI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorManagement.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorInformation.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/ErrorType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitBoolean.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitRange.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StreamI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeoutType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeStamp.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Architecture/x86_gcc/HighResolutionTimerA.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/HighResolutionTimerCalibrator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeStamp.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/CharBuffer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorManagement.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/BufferedStreamI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeoutType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/AnyType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassProperties.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/FractionalInteger.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassRegistryDatabase.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GlobalObjectsDatabase.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GlobalObjectI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/StandardHeap.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../HeapI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../Generic/StandardHeap_Generic.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/FastPollingMutexSem.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Atomic.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Architecture/x86_gcc/AtomicA.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Sleep.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassRegistryItem.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CString.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/ZeroTerminatedArray.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/Introspection.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/IntrospectionEntry.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/ZeroTerminatedArray.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListable.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListHolderT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/IteratorT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Iterator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListable.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListHolder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/SortFilter.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/SearchFilter.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/LoadableLibrary.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ObjectBuilder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HeapI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StaticList.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StaticListHolder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Matrix.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Vector.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/MemoryOperationsHelper.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/FormatDescriptor.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/IOBuffer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StreamI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StringHelper.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/StreamStringIOBuffer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-internal.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-port.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-message.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-string.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-filepath.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-death-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-death-test-internal.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-param-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-param-util.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-linked_ptr.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-printers.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest_prod.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-test-part.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-typed-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest_pred_impl.h
|
||||||
|
../../Build/x86-linux//GTest/MainGTest.o: MainGTest.cpp \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorManagement.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorInformation.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/ErrorType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Architecture/x86_gcc/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitBoolean.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TemplateParametersVerificator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitRange.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TypeCharacteristics.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TypeCharacteristics.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StreamI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeoutType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeStamp.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Architecture/x86_gcc/HighResolutionTimerA.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/HighResolutionTimerCalibrator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeStamp.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/Object.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HeapI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorManagement.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HeapManager.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HeapI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassProperties.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/FractionalInteger.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassRegistryItem.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CString.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/ZeroTerminatedArray.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/Introspection.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/IntrospectionEntry.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TypeDescriptor.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BasicType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/FractionalInteger.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitRange.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitBoolean.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/ZeroTerminatedArray.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListable.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListHolderT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/IteratorT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Iterator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListable.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListHolder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/SortFilter.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/SearchFilter.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/LoadableLibrary.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ObjectBuilder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StringHelper.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/StructuredDataI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/AnyType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassRegistryDatabase.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GlobalObjectsDatabase.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GlobalObjectI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/StandardHeap.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../HeapI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../Generic/StandardHeap_Generic.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/FastPollingMutexSem.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Atomic.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Architecture/x86_gcc/AtomicA.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Sleep.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StaticList.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StaticListHolder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Matrix.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Vector.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/MemoryOperationsHelper.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/CLASSREGISTER.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassRegistryItemT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ObjectBuilderT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/StreamString.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/CharBuffer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/BufferedStreamI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeoutType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/AnyType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/FormatDescriptor.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/IOBuffer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StreamI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/StreamStringIOBuffer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-internal.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-port.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-message.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-string.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-filepath.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-death-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-death-test-internal.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-param-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-param-util.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-linked_ptr.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-printers.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest_prod.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-test-part.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-typed-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest_pred_impl.h
|
||||||
@@ -0,0 +1,197 @@
|
|||||||
|
DebugServiceGTest.o: DebugServiceGTest.cpp \
|
||||||
|
../../Source/Components/Interfaces/DebugService/DebugCore.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Architecture/x86_gcc/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TypeDescriptor.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BasicType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/FractionalInteger.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TypeCharacteristics.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TemplateParametersVerificator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitRange.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitBoolean.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/StreamString.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TypeCharacteristics.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HeapManager.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HeapI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorManagement.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorInformation.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/ErrorType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitBoolean.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitRange.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StreamI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeoutType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeStamp.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Architecture/x86_gcc/HighResolutionTimerA.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/HighResolutionTimerCalibrator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeStamp.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/CharBuffer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorManagement.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/BufferedStreamI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeoutType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/AnyType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassProperties.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/FractionalInteger.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassRegistryDatabase.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GlobalObjectsDatabase.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GlobalObjectI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/StandardHeap.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../HeapI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../Generic/StandardHeap_Generic.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/FastPollingMutexSem.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Atomic.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Architecture/x86_gcc/AtomicA.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Sleep.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassRegistryItem.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CString.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/ZeroTerminatedArray.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/Introspection.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/IntrospectionEntry.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/ZeroTerminatedArray.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListable.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListHolderT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/IteratorT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Iterator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListable.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListHolder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/SortFilter.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/SearchFilter.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/LoadableLibrary.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ObjectBuilder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HeapI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StaticList.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StaticListHolder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Matrix.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Vector.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/MemoryOperationsHelper.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/FormatDescriptor.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/IOBuffer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StreamI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StringHelper.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/StreamStringIOBuffer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-internal.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-port.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-message.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-string.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-filepath.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-death-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-death-test-internal.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-param-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-param-util.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-linked_ptr.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-printers.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest_prod.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-test-part.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-typed-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest_pred_impl.h
|
||||||
|
MainGTest.o: MainGTest.cpp \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorManagement.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorInformation.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/ErrorType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Architecture/x86_gcc/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitBoolean.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TemplateParametersVerificator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitRange.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TypeCharacteristics.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/TypeCharacteristics.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StreamI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeoutType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeStamp.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Architecture/x86_gcc/HighResolutionTimerA.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CompilerTypes.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../HighResolutionTimer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/HighResolutionTimerCalibrator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeStamp.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/Object.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HeapI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/ErrorManagement.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HeapManager.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/HeapI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassProperties.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GeneralDefinitions.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/FractionalInteger.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassRegistryItem.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/CString.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/ZeroTerminatedArray.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/Introspection.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/IntrospectionEntry.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TypeDescriptor.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BasicType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/FractionalInteger.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitRange.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/BitBoolean.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/ZeroTerminatedArray.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListable.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListHolderT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/IteratorT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Iterator.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListable.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/LinkedListHolder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/SortFilter.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/SearchFilter.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/LoadableLibrary.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ObjectBuilder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StringHelper.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/StructuredDataI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/AnyType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassRegistryDatabase.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GlobalObjectsDatabase.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/GlobalObjectI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/StandardHeap.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../../HeapI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Environment/Linux/../Generic/StandardHeap_Generic.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/FastPollingMutexSem.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Atomic.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Architecture/x86_gcc/AtomicA.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/Sleep.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StaticList.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StaticListHolder.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Matrix.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L0Types/Vector.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/MemoryOperationsHelper.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/CLASSREGISTER.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ClassRegistryItemT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/ObjectBuilderT.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/StreamString.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/CharBuffer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/BufferedStreamI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/TimeoutType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L2Objects/AnyType.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/FormatDescriptor.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/IOBuffer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L1Portability/StreamI.h \
|
||||||
|
/home/martino/workspace/MARTe2/Source/Core/BareMetal/L3Streams/StreamStringIOBuffer.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-internal.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-port.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-message.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-string.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-filepath.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-death-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-death-test-internal.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-param-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-param-util.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-linked_ptr.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-printers.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest_prod.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-test-part.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest-typed-test.h \
|
||||||
|
/home/martino/workspace/MARTe2/Lib/gtest-1.7.0/include/gtest/gtest_pred_impl.h
|
||||||
@@ -0,0 +1,680 @@
|
|||||||
|
#include "DebugService.h"
|
||||||
|
#include "GlobalObjectsDatabase.h"
|
||||||
|
#include "ObjectRegistryDatabase.h"
|
||||||
|
#include "RealTimeApplication.h"
|
||||||
|
#include "StandardParser.h"
|
||||||
|
#include "StreamString.h"
|
||||||
|
#include "StringHelper.h"
|
||||||
|
#include "TestCommon.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
using namespace MARTe;
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
const char8 * const debug_commands_config =
|
||||||
|
"DebugService = {"
|
||||||
|
" Class = DebugService "
|
||||||
|
" ControlPort = 8120 "
|
||||||
|
" UdpPort = 8121 "
|
||||||
|
" StreamIP = \"127.0.0.1\" "
|
||||||
|
"}"
|
||||||
|
"App = {"
|
||||||
|
" Class = RealTimeApplication "
|
||||||
|
" +Functions = {"
|
||||||
|
" Class = ReferenceContainer "
|
||||||
|
" +GAM1 = {"
|
||||||
|
" Class = IOGAM "
|
||||||
|
" InputSignals = {"
|
||||||
|
" Counter = { DataSource = Timer Type = uint32 Frequency = 1000 }"
|
||||||
|
" Time = { DataSource = Timer Type = uint32 }"
|
||||||
|
" }"
|
||||||
|
" OutputSignals = {"
|
||||||
|
" Counter = { DataSource = DDB Type = uint32 }"
|
||||||
|
" Time = { DataSource = DDB Type = uint32 }"
|
||||||
|
" }"
|
||||||
|
" }"
|
||||||
|
" }"
|
||||||
|
" +Data = {"
|
||||||
|
" Class = ReferenceContainer "
|
||||||
|
" DefaultDataSource = DDB "
|
||||||
|
" +Timer = { Class = LinuxTimer SleepTime = 1000 Signals = { Counter = { Type = uint32 } Time = { Type = uint32 } } }"
|
||||||
|
" +DDB = { Class = GAMDataSource Signals = { Counter = { Type = uint32 } Time = { Type = uint32 } } }"
|
||||||
|
" +DAMS = { Class = TimingDataSource }"
|
||||||
|
" }"
|
||||||
|
" +States = {"
|
||||||
|
" Class = ReferenceContainer "
|
||||||
|
" +State1 = { Class = RealTimeState +Threads = { Class = ReferenceContainer +Thread1 = { Class = RealTimeThread Functions = {GAM1} } } }"
|
||||||
|
" }"
|
||||||
|
" +Scheduler = { Class = GAMScheduler TimingDataSource = DAMS }"
|
||||||
|
"}";
|
||||||
|
|
||||||
|
const uint16 CONTROL_PORT = 8120u;
|
||||||
|
const char8 * const SIGNAL_NAME = "App.Data.DDB.Counter";
|
||||||
|
|
||||||
|
// Pulls the value out of a `{"Name":...,"Value":"<v>", ...}` VALUE reply.
|
||||||
|
// The command replies are fixed-format enough that a plain substring scan
|
||||||
|
// is sufficient (no need for a full JSON parser in these integration tests).
|
||||||
|
bool ExtractValueStr(const char8 *reply, StreamString &val) {
|
||||||
|
const char8 *key = "\"Value\":\"";
|
||||||
|
const char8 *p = StringHelper::SearchString(reply, key);
|
||||||
|
if (p == NULL_PTR(const char8 *)) return false;
|
||||||
|
p += StringHelper::Length(key);
|
||||||
|
const char8 *end = StringHelper::SearchString(p, "\"");
|
||||||
|
if (end == NULL_PTR(const char8 *)) return false;
|
||||||
|
val = "";
|
||||||
|
while (p < end) {
|
||||||
|
val += *p;
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ExtractValueUint32(const char8 *reply, uint32 &val) {
|
||||||
|
StreamString s;
|
||||||
|
if (!ExtractValueStr(reply, s)) return false;
|
||||||
|
const char8 *p = s.Buffer();
|
||||||
|
if (p == NULL_PTR(const char8 *) || *p == '\0') return false;
|
||||||
|
val = 0u;
|
||||||
|
while (*p != '\0') {
|
||||||
|
if (*p < '0' || *p > '9') return false;
|
||||||
|
val = (val * 10u) + (uint32)(*p - '0');
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool QueryValueUint32(uint32 &val) {
|
||||||
|
StreamString reply;
|
||||||
|
if (!SendCommandGAM(CONTROL_PORT, "VALUE App.Data.DDB.Counter\n", reply))
|
||||||
|
return false;
|
||||||
|
return ExtractValueUint32(reply.Buffer(), val);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
void TestDebugCommands() {
|
||||||
|
printf("--- Test: FORCE/UNFORCE/BREAK/STEP/STEP_STATUS/VALUE/LS Commands ---\n");
|
||||||
|
|
||||||
|
ObjectRegistryDatabase::Instance()->Purge();
|
||||||
|
|
||||||
|
ConfigurationDatabase cdb;
|
||||||
|
StreamString ss = debug_commands_config;
|
||||||
|
ss.Seek(0);
|
||||||
|
StandardParser parser(ss, cdb);
|
||||||
|
if (!parser.Parse()) {
|
||||||
|
printf("ERROR: Failed to parse config\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
cdb.MoveToRoot();
|
||||||
|
uint32 n = cdb.GetNumberOfChildren();
|
||||||
|
for (uint32 i = 0; i < n; i++) {
|
||||||
|
const char8 *name = cdb.GetChildName(i);
|
||||||
|
ConfigurationDatabase child;
|
||||||
|
cdb.MoveRelative(name);
|
||||||
|
cdb.Copy(child);
|
||||||
|
cdb.MoveToAncestor(1u);
|
||||||
|
|
||||||
|
StreamString className;
|
||||||
|
child.Read("Class", className);
|
||||||
|
|
||||||
|
Reference ref(className.Buffer(),
|
||||||
|
GlobalObjectsDatabase::Instance()->GetStandardHeap());
|
||||||
|
if (!ref.IsValid()) {
|
||||||
|
printf("ERROR: Could not create object %s of class %s\n", name,
|
||||||
|
className.Buffer());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
ref->SetName(name);
|
||||||
|
if (!ref->Initialise(child)) {
|
||||||
|
printf("ERROR: Failed to initialise object %s\n", name);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
ObjectRegistryDatabase::Instance()->Insert(ref);
|
||||||
|
}
|
||||||
|
|
||||||
|
ReferenceT<DebugService> service =
|
||||||
|
ObjectRegistryDatabase::Instance()->Find("DebugService");
|
||||||
|
if (!service.IsValid()) {
|
||||||
|
printf("ERROR: DebugService not found\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
service->SetFullConfig(cdb);
|
||||||
|
|
||||||
|
ReferenceT<RealTimeApplication> app =
|
||||||
|
ObjectRegistryDatabase::Instance()->Find("App");
|
||||||
|
if (!app.IsValid()) {
|
||||||
|
printf("ERROR: App not found\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!app->ConfigureApplication()) {
|
||||||
|
printf("ERROR: ConfigureApplication failed.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (app->PrepareNextState("State1") != ErrorManagement::NoError) {
|
||||||
|
printf("ERROR: PrepareNextState failed.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (app->StartNextStateExecution() != ErrorManagement::NoError) {
|
||||||
|
printf("ERROR: StartNextStateExecution failed.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Application started.\n");
|
||||||
|
Sleep::MSec(1000);
|
||||||
|
|
||||||
|
// Step 1: VALUE baseline.
|
||||||
|
printf("\n--- Step 1: VALUE ---\n");
|
||||||
|
{
|
||||||
|
StreamString reply;
|
||||||
|
if (SendCommandGAM(CONTROL_PORT, "VALUE App.Data.DDB.Counter\n", reply)) {
|
||||||
|
printf("VALUE response: %s", reply.Buffer());
|
||||||
|
uint32 v = 0u;
|
||||||
|
if (StringHelper::SearchString(reply.Buffer(), "OK VALUE") !=
|
||||||
|
NULL_PTR(const char8 *) &&
|
||||||
|
ExtractValueUint32(reply.Buffer(), v)) {
|
||||||
|
printf("SUCCESS: VALUE returned a parseable counter value (%u).\n", v);
|
||||||
|
} else {
|
||||||
|
printf("FAILURE: VALUE reply malformed.\n");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
printf("FAILURE: VALUE command failed.\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Step 2: VALUE on an unknown signal should report an error, not crash.
|
||||||
|
printf("\n--- Step 2: VALUE on unknown signal ---\n");
|
||||||
|
{
|
||||||
|
StreamString reply;
|
||||||
|
if (SendCommandGAM(CONTROL_PORT, "VALUE App.Data.DDB.NoSuchSignal\n",
|
||||||
|
reply)) {
|
||||||
|
printf("VALUE response: %s", reply.Buffer());
|
||||||
|
if (StringHelper::SearchString(reply.Buffer(), "Error") !=
|
||||||
|
NULL_PTR(const char8 *)) {
|
||||||
|
printf("SUCCESS: Unknown signal reported as an error.\n");
|
||||||
|
} else {
|
||||||
|
printf("FAILURE: Unknown signal did not report an error.\n");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
printf("FAILURE: VALUE command failed.\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Step 3: LS with an explicit path.
|
||||||
|
printf("\n--- Step 3: LS App.Data ---\n");
|
||||||
|
{
|
||||||
|
StreamString reply;
|
||||||
|
if (SendCommandGAM(CONTROL_PORT, "LS App.Data\n", reply)) {
|
||||||
|
printf("LS response: %s", reply.Buffer());
|
||||||
|
if (StringHelper::SearchString(reply.Buffer(), "DDB") !=
|
||||||
|
NULL_PTR(const char8 *) &&
|
||||||
|
StringHelper::SearchString(reply.Buffer(), "OK LS") !=
|
||||||
|
NULL_PTR(const char8 *)) {
|
||||||
|
printf("SUCCESS: LS App.Data listed the DDB data source.\n");
|
||||||
|
} else {
|
||||||
|
printf("FAILURE: LS App.Data did not list expected children.\n");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
printf("FAILURE: LS command failed.\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Step 4: bare LS (root). Regression test: this used to wrap the
|
||||||
|
// ObjectRegistryDatabase singleton in a Reference, which decremented its
|
||||||
|
// refcount to zero and deleted it when the Reference went out of scope,
|
||||||
|
// permanently killing the TCP control server. Verify both that LS itself
|
||||||
|
// succeeds AND that the control server is still alive afterwards.
|
||||||
|
printf("\n--- Step 4: bare LS (root) ---\n");
|
||||||
|
{
|
||||||
|
StreamString reply;
|
||||||
|
bool lsOk = SendCommandGAM(CONTROL_PORT, "LS\n", reply);
|
||||||
|
if (lsOk) {
|
||||||
|
printf("LS response: %s", reply.Buffer());
|
||||||
|
}
|
||||||
|
bool lsGood =
|
||||||
|
lsOk &&
|
||||||
|
StringHelper::SearchString(reply.Buffer(), "App") !=
|
||||||
|
NULL_PTR(const char8 *) &&
|
||||||
|
StringHelper::SearchString(reply.Buffer(), "DebugService") !=
|
||||||
|
NULL_PTR(const char8 *) &&
|
||||||
|
StringHelper::SearchString(reply.Buffer(), "OK LS") !=
|
||||||
|
NULL_PTR(const char8 *);
|
||||||
|
|
||||||
|
StreamString postReply;
|
||||||
|
bool postOk = SendCommandGAM(CONTROL_PORT, "VALUE App.Data.DDB.Counter\n",
|
||||||
|
postReply);
|
||||||
|
bool postGood = postOk && StringHelper::SearchString(postReply.Buffer(),
|
||||||
|
"OK VALUE") !=
|
||||||
|
NULL_PTR(const char8 *);
|
||||||
|
|
||||||
|
if (lsGood && postGood) {
|
||||||
|
printf("SUCCESS: bare LS listed the root and control server survived.\n");
|
||||||
|
} else {
|
||||||
|
printf("FAILURE: bare LS broke the control server (lsGood=%d postGood=%d).\n",
|
||||||
|
lsGood, postGood);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Step 5: FORCE holds the signal at a fixed value.
|
||||||
|
printf("\n--- Step 5: FORCE ---\n");
|
||||||
|
{
|
||||||
|
StreamString reply;
|
||||||
|
bool ok = SendCommandGAM(CONTROL_PORT,
|
||||||
|
"FORCE App.Data.DDB.Counter 424242\n", reply);
|
||||||
|
printf("FORCE response: %s", ok ? reply.Buffer() : "(no reply)");
|
||||||
|
bool forceAccepted =
|
||||||
|
ok && StringHelper::SearchString(reply.Buffer(), "OK FORCE 1") !=
|
||||||
|
NULL_PTR(const char8 *);
|
||||||
|
|
||||||
|
Sleep::MSec(150);
|
||||||
|
StreamString v1;
|
||||||
|
bool v1Ok = SendCommandGAM(CONTROL_PORT, "VALUE App.Data.DDB.Counter\n", v1);
|
||||||
|
Sleep::MSec(150);
|
||||||
|
StreamString v2;
|
||||||
|
bool v2Ok = SendCommandGAM(CONTROL_PORT, "VALUE App.Data.DDB.Counter\n", v2);
|
||||||
|
|
||||||
|
bool bothForced =
|
||||||
|
v1Ok && v2Ok &&
|
||||||
|
StringHelper::SearchString(v1.Buffer(), "\"Value\":\"424242\"") !=
|
||||||
|
NULL_PTR(const char8 *) &&
|
||||||
|
StringHelper::SearchString(v2.Buffer(), "\"Value\":\"424242\"") !=
|
||||||
|
NULL_PTR(const char8 *);
|
||||||
|
|
||||||
|
if (forceAccepted && bothForced) {
|
||||||
|
printf("SUCCESS: FORCE held the signal at 424242 across two reads.\n");
|
||||||
|
} else {
|
||||||
|
printf("FAILURE: FORCE did not hold the forced value.\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Step 6: UNFORCE lets the signal resume advancing.
|
||||||
|
printf("\n--- Step 6: UNFORCE ---\n");
|
||||||
|
{
|
||||||
|
StreamString reply;
|
||||||
|
bool ok =
|
||||||
|
SendCommandGAM(CONTROL_PORT, "UNFORCE App.Data.DDB.Counter\n", reply);
|
||||||
|
printf("UNFORCE response: %s", ok ? reply.Buffer() : "(no reply)");
|
||||||
|
bool unforceAccepted =
|
||||||
|
ok && StringHelper::SearchString(reply.Buffer(), "OK UNFORCE 1") !=
|
||||||
|
NULL_PTR(const char8 *);
|
||||||
|
|
||||||
|
Sleep::MSec(200);
|
||||||
|
uint32 v1 = 0u;
|
||||||
|
bool v1Ok = QueryValueUint32(v1);
|
||||||
|
Sleep::MSec(200);
|
||||||
|
uint32 v2 = 0u;
|
||||||
|
bool v2Ok = QueryValueUint32(v2);
|
||||||
|
|
||||||
|
bool advancing = v1Ok && v2Ok && v1 != 424242u && v2 > v1;
|
||||||
|
|
||||||
|
if (unforceAccepted && advancing) {
|
||||||
|
printf("SUCCESS: UNFORCE resumed live updates (%u -> %u).\n", v1, v2);
|
||||||
|
} else {
|
||||||
|
printf("FAILURE: UNFORCE did not resume live updates (%u -> %u).\n", v1,
|
||||||
|
v2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Step 7: PAUSE holds execution, STEP advances one command-cycle at a
|
||||||
|
// time while STEP_STATUS reports the paused state, RESUME lets it run
|
||||||
|
// free again.
|
||||||
|
//
|
||||||
|
// NOTE: OutputPauseAndStep() (DebugBrokerWrapper.h) blocks the RT thread
|
||||||
|
// in a nested pause/step spin *after* the current cycle's data has
|
||||||
|
// already been committed. As a result, the very first STEP issued right
|
||||||
|
// after a manual PAUSE only moves the thread from the first spin to the
|
||||||
|
// second spin without producing a new committed cycle (no observable
|
||||||
|
// value change) -- it takes a second STEP to see the counter actually
|
||||||
|
// advance. This is verified/tolerated below rather than asserted away.
|
||||||
|
printf("\n--- Step 7: PAUSE / STEP / STEP_STATUS / RESUME ---\n");
|
||||||
|
{
|
||||||
|
StreamString pauseReply;
|
||||||
|
bool pauseOk = SendCommandGAM(CONTROL_PORT, "PAUSE\n", pauseReply);
|
||||||
|
printf("PAUSE response: %s", pauseOk ? pauseReply.Buffer() : "(no reply)");
|
||||||
|
|
||||||
|
Sleep::MSec(150);
|
||||||
|
uint32 vPaused1 = 0u;
|
||||||
|
QueryValueUint32(vPaused1);
|
||||||
|
Sleep::MSec(150);
|
||||||
|
uint32 vPaused2 = 0u;
|
||||||
|
QueryValueUint32(vPaused2);
|
||||||
|
bool heldWhilePaused = (vPaused1 == vPaused2);
|
||||||
|
if (heldWhilePaused) {
|
||||||
|
printf("SUCCESS: Counter held steady while paused (%u).\n", vPaused1);
|
||||||
|
} else {
|
||||||
|
printf("FAILURE: Counter moved while paused (%u -> %u).\n", vPaused1,
|
||||||
|
vPaused2);
|
||||||
|
}
|
||||||
|
|
||||||
|
StreamString statusReply;
|
||||||
|
bool statusOk = SendCommandGAM(CONTROL_PORT, "STEP_STATUS\n", statusReply);
|
||||||
|
printf("STEP_STATUS response: %s",
|
||||||
|
statusOk ? statusReply.Buffer() : "(no reply)");
|
||||||
|
bool pausedReported =
|
||||||
|
statusOk && StringHelper::SearchString(statusReply.Buffer(),
|
||||||
|
"\"Paused\":true") !=
|
||||||
|
NULL_PTR(const char8 *);
|
||||||
|
if (pausedReported) {
|
||||||
|
printf("SUCCESS: STEP_STATUS reports Paused=true.\n");
|
||||||
|
} else {
|
||||||
|
printf("FAILURE: STEP_STATUS did not report Paused=true.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
// "Primer" STEP: settles the one-time spin-transition quirk described
|
||||||
|
// above; no value-change assertion here by design.
|
||||||
|
StreamString step1Reply;
|
||||||
|
SendCommandGAM(CONTROL_PORT, "STEP 1\n", step1Reply);
|
||||||
|
Sleep::MSec(150);
|
||||||
|
uint32 vAfterPrimer = 0u;
|
||||||
|
QueryValueUint32(vAfterPrimer);
|
||||||
|
|
||||||
|
StreamString step2Reply;
|
||||||
|
bool step2Ok = SendCommandGAM(CONTROL_PORT, "STEP 2\n", step2Reply);
|
||||||
|
printf("STEP 2 response: %s", step2Ok ? step2Reply.Buffer() : "(no reply)");
|
||||||
|
Sleep::MSec(200);
|
||||||
|
uint32 vAfterStep = 0u;
|
||||||
|
bool vAfterStepOk = QueryValueUint32(vAfterStep);
|
||||||
|
|
||||||
|
bool stepAdvanced = vAfterStepOk && vAfterStep > vAfterPrimer;
|
||||||
|
if (stepAdvanced) {
|
||||||
|
printf("SUCCESS: STEP advanced the counter (%u -> %u).\n", vAfterPrimer,
|
||||||
|
vAfterStep);
|
||||||
|
} else {
|
||||||
|
printf("FAILURE: STEP did not advance the counter (%u -> %u).\n",
|
||||||
|
vAfterPrimer, vAfterStep);
|
||||||
|
}
|
||||||
|
|
||||||
|
StreamString resumeReply;
|
||||||
|
bool resumeOk = SendCommandGAM(CONTROL_PORT, "RESUME\n", resumeReply);
|
||||||
|
printf("RESUME response: %s",
|
||||||
|
resumeOk ? resumeReply.Buffer() : "(no reply)");
|
||||||
|
|
||||||
|
Sleep::MSec(200);
|
||||||
|
uint32 vResumed1 = 0u;
|
||||||
|
QueryValueUint32(vResumed1);
|
||||||
|
Sleep::MSec(200);
|
||||||
|
uint32 vResumed2 = 0u;
|
||||||
|
bool resumedOk = QueryValueUint32(vResumed2);
|
||||||
|
bool freeRunning = resumedOk && vResumed2 > vResumed1;
|
||||||
|
if (freeRunning) {
|
||||||
|
printf("SUCCESS: RESUME let execution run free again (%u -> %u).\n",
|
||||||
|
vResumed1, vResumed2);
|
||||||
|
} else {
|
||||||
|
printf("FAILURE: Execution did not resume (%u -> %u).\n", vResumed1,
|
||||||
|
vResumed2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Step 8: BREAK auto-pauses when the condition is met and holds the
|
||||||
|
// value; BREAK ... OFF clears the condition without auto-resuming.
|
||||||
|
printf("\n--- Step 8: BREAK / BREAK OFF ---\n");
|
||||||
|
{
|
||||||
|
uint32 baseline = 0u;
|
||||||
|
QueryValueUint32(baseline);
|
||||||
|
// Counter increments ~1 per RT cycle (1 kHz); +300 is reachable well
|
||||||
|
// within the retry budget below without being trivially already-true.
|
||||||
|
uint32 target = baseline + 300u;
|
||||||
|
|
||||||
|
StreamString cmd;
|
||||||
|
cmd.Printf("BREAK App.Data.DDB.Counter > %u\n", target);
|
||||||
|
StreamString breakReply;
|
||||||
|
bool breakOk = SendCommandGAM(CONTROL_PORT, cmd.Buffer(), breakReply);
|
||||||
|
printf("BREAK response: %s", breakOk ? breakReply.Buffer() : "(no reply)");
|
||||||
|
bool breakAccepted =
|
||||||
|
breakOk && StringHelper::SearchString(breakReply.Buffer(),
|
||||||
|
"OK BREAK 1") !=
|
||||||
|
NULL_PTR(const char8 *);
|
||||||
|
|
||||||
|
bool pausedByBreak = false;
|
||||||
|
for (int retry = 0; retry < 30 && !pausedByBreak; retry++) {
|
||||||
|
Sleep::MSec(100);
|
||||||
|
StreamString statusReply;
|
||||||
|
if (SendCommandGAM(CONTROL_PORT, "STEP_STATUS\n", statusReply)) {
|
||||||
|
if (StringHelper::SearchString(statusReply.Buffer(),
|
||||||
|
"\"Paused\":true") !=
|
||||||
|
NULL_PTR(const char8 *)) {
|
||||||
|
pausedByBreak = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (pausedByBreak) {
|
||||||
|
printf("SUCCESS: BREAK auto-paused once the condition was met.\n");
|
||||||
|
} else {
|
||||||
|
printf("FAILURE: BREAK never paused execution (target=%u).\n", target);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32 held1 = 0u, held2 = 0u;
|
||||||
|
QueryValueUint32(held1);
|
||||||
|
Sleep::MSec(200);
|
||||||
|
QueryValueUint32(held2);
|
||||||
|
bool heldAfterBreak = (held1 == held2) && (held1 >= target);
|
||||||
|
if (heldAfterBreak) {
|
||||||
|
printf("SUCCESS: Value held at/above the break target (%u).\n", held1);
|
||||||
|
} else {
|
||||||
|
printf("FAILURE: Value not held after break (%u -> %u, target=%u).\n",
|
||||||
|
held1, held2, target);
|
||||||
|
}
|
||||||
|
|
||||||
|
StreamString offReply;
|
||||||
|
bool offOk = SendCommandGAM(CONTROL_PORT,
|
||||||
|
"BREAK App.Data.DDB.Counter OFF\n", offReply);
|
||||||
|
printf("BREAK OFF response: %s", offOk ? offReply.Buffer() : "(no reply)");
|
||||||
|
bool offAccepted =
|
||||||
|
offOk && StringHelper::SearchString(offReply.Buffer(), "OK BREAK") !=
|
||||||
|
NULL_PTR(const char8 *);
|
||||||
|
|
||||||
|
StreamString statusAfterOff;
|
||||||
|
bool statusOk =
|
||||||
|
SendCommandGAM(CONTROL_PORT, "STEP_STATUS\n", statusAfterOff);
|
||||||
|
bool stillPaused =
|
||||||
|
statusOk && StringHelper::SearchString(statusAfterOff.Buffer(),
|
||||||
|
"\"Paused\":true") !=
|
||||||
|
NULL_PTR(const char8 *);
|
||||||
|
if (stillPaused) {
|
||||||
|
printf("SUCCESS: BREAK OFF cleared the condition without auto-resuming.\n");
|
||||||
|
} else {
|
||||||
|
printf("FAILURE: Clearing BREAK unexpectedly changed the paused state.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!breakAccepted || !offAccepted) {
|
||||||
|
printf("FAILURE: BREAK/BREAK OFF command replies malformed.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
StreamString resumeReply;
|
||||||
|
SendCommandGAM(CONTROL_PORT, "RESUME\n", resumeReply);
|
||||||
|
Sleep::MSec(200);
|
||||||
|
uint32 vFinal1 = 0u, vFinal2 = 0u;
|
||||||
|
QueryValueUint32(vFinal1);
|
||||||
|
Sleep::MSec(200);
|
||||||
|
bool finalOk = QueryValueUint32(vFinal2);
|
||||||
|
if (finalOk && vFinal2 > vFinal1) {
|
||||||
|
printf("SUCCESS: Execution resumed after BREAK OFF + RESUME.\n");
|
||||||
|
} else {
|
||||||
|
printf("FAILURE: Execution did not resume after BREAK OFF + RESUME.\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Step 9: TREE on a DataSource path exercises the signal-listing branch
|
||||||
|
// of ExportTreeNode (as opposed to the plain child-container branch that
|
||||||
|
// a bare/root TREE hits).
|
||||||
|
printf("\n--- Step 9: TREE App.Data.Timer (DataSource) ---\n");
|
||||||
|
{
|
||||||
|
StreamString reply;
|
||||||
|
if (SendCommandGAM(CONTROL_PORT, "TREE App.Data.Timer\n", reply)) {
|
||||||
|
printf("TREE response: %s", reply.Buffer());
|
||||||
|
if (StringHelper::SearchString(reply.Buffer(), "\"Class\":\"Signal\"") !=
|
||||||
|
NULL_PTR(const char8 *) &&
|
||||||
|
StringHelper::SearchString(reply.Buffer(), "OK TREE") !=
|
||||||
|
NULL_PTR(const char8 *)) {
|
||||||
|
printf("SUCCESS: TREE on a DataSource listed its signals.\n");
|
||||||
|
} else {
|
||||||
|
printf("FAILURE: TREE on a DataSource did not list signals.\n");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
printf("FAILURE: TREE command failed.\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Step 10: TREE on a GAM path exercises the InputSignal/OutputSignal
|
||||||
|
// listing branches of ExportTreeNode.
|
||||||
|
printf("\n--- Step 10: TREE App.Functions.GAM1 (GAM) ---\n");
|
||||||
|
{
|
||||||
|
StreamString reply;
|
||||||
|
if (SendCommandGAM(CONTROL_PORT, "TREE App.Functions.GAM1\n", reply)) {
|
||||||
|
printf("TREE response: %s", reply.Buffer());
|
||||||
|
if (StringHelper::SearchString(reply.Buffer(),
|
||||||
|
"\"Class\":\"InputSignal\"") !=
|
||||||
|
NULL_PTR(const char8 *) &&
|
||||||
|
StringHelper::SearchString(reply.Buffer(),
|
||||||
|
"\"Class\":\"OutputSignal\"") !=
|
||||||
|
NULL_PTR(const char8 *) &&
|
||||||
|
StringHelper::SearchString(reply.Buffer(), "OK TREE") !=
|
||||||
|
NULL_PTR(const char8 *)) {
|
||||||
|
printf("SUCCESS: TREE on a GAM listed its input and output signals.\n");
|
||||||
|
} else {
|
||||||
|
printf("FAILURE: TREE on a GAM did not list In/Out signals.\n");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
printf("FAILURE: TREE command failed.\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Step 11: INFO on a name that matches neither a registry object nor a
|
||||||
|
// signal alias must report an error rather than crash.
|
||||||
|
printf("\n--- Step 11: INFO on unknown name ---\n");
|
||||||
|
{
|
||||||
|
StreamString reply;
|
||||||
|
if (SendCommandGAM(CONTROL_PORT, "INFO App.Data.DDB.NoSuchThing\n",
|
||||||
|
reply)) {
|
||||||
|
printf("INFO response: %s", reply.Buffer());
|
||||||
|
if (StringHelper::SearchString(reply.Buffer(), "Object not found") !=
|
||||||
|
NULL_PTR(const char8 *) &&
|
||||||
|
StringHelper::SearchString(reply.Buffer(), "OK INFO") !=
|
||||||
|
NULL_PTR(const char8 *)) {
|
||||||
|
printf("SUCCESS: INFO on an unknown name reported an error.\n");
|
||||||
|
} else {
|
||||||
|
printf("FAILURE: INFO on an unknown name did not report an error.\n");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
printf("FAILURE: INFO command failed.\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
app->StopCurrentStateExecution();
|
||||||
|
ObjectRegistryDatabase::Instance()->Purge();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// TestDebugConfigAutoRebuild
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// CONFIG normally serves back the ConfigurationDatabase handed to
|
||||||
|
// SetFullConfig() by the application's own startup code. If SetFullConfig()
|
||||||
|
// is never called (manualConfigSet stays false), ServeConfig() instead
|
||||||
|
// falls back to RebuildConfigFromRegistry(), which walks the live
|
||||||
|
// ObjectRegistryDatabase tree (BuildCDBFromContainer) to reconstruct an
|
||||||
|
// equivalent configuration on demand. This exercises that fallback path.
|
||||||
|
void TestDebugConfigAutoRebuild() {
|
||||||
|
printf("--- Test: CONFIG auto-rebuild from registry (no SetFullConfig) ---\n");
|
||||||
|
|
||||||
|
ObjectRegistryDatabase::Instance()->Purge();
|
||||||
|
|
||||||
|
ConfigurationDatabase cdb;
|
||||||
|
StreamString ss = debug_commands_config;
|
||||||
|
ss.Seek(0);
|
||||||
|
StandardParser parser(ss, cdb);
|
||||||
|
if (!parser.Parse()) {
|
||||||
|
printf("ERROR: Failed to parse config\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
cdb.MoveToRoot();
|
||||||
|
uint32 n = cdb.GetNumberOfChildren();
|
||||||
|
for (uint32 i = 0; i < n; i++) {
|
||||||
|
const char8 *name = cdb.GetChildName(i);
|
||||||
|
ConfigurationDatabase child;
|
||||||
|
cdb.MoveRelative(name);
|
||||||
|
cdb.Copy(child);
|
||||||
|
cdb.MoveToAncestor(1u);
|
||||||
|
|
||||||
|
StreamString className;
|
||||||
|
child.Read("Class", className);
|
||||||
|
|
||||||
|
Reference ref(className.Buffer(),
|
||||||
|
GlobalObjectsDatabase::Instance()->GetStandardHeap());
|
||||||
|
if (!ref.IsValid()) {
|
||||||
|
printf("ERROR: Could not create object %s of class %s\n", name,
|
||||||
|
className.Buffer());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
ref->SetName(name);
|
||||||
|
if (!ref->Initialise(child)) {
|
||||||
|
printf("ERROR: Failed to initialise object %s\n", name);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
ObjectRegistryDatabase::Instance()->Insert(ref);
|
||||||
|
}
|
||||||
|
|
||||||
|
ReferenceT<DebugService> service =
|
||||||
|
ObjectRegistryDatabase::Instance()->Find("DebugService");
|
||||||
|
if (!service.IsValid()) {
|
||||||
|
printf("ERROR: DebugService not found\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Deliberately do NOT call service->SetFullConfig(cdb) here: CONFIG must
|
||||||
|
// still work by rebuilding from the registry on the fly.
|
||||||
|
|
||||||
|
ReferenceT<RealTimeApplication> app =
|
||||||
|
ObjectRegistryDatabase::Instance()->Find("App");
|
||||||
|
if (!app.IsValid()) {
|
||||||
|
printf("ERROR: App not found\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!app->ConfigureApplication()) {
|
||||||
|
printf("ERROR: ConfigureApplication failed.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (app->PrepareNextState("State1") != ErrorManagement::NoError) {
|
||||||
|
printf("ERROR: PrepareNextState failed.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (app->StartNextStateExecution() != ErrorManagement::NoError) {
|
||||||
|
printf("ERROR: StartNextStateExecution failed.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Application started.\n");
|
||||||
|
Sleep::MSec(1000);
|
||||||
|
|
||||||
|
printf("\n--- Step 1: CONFIG without a prior SetFullConfig ---\n");
|
||||||
|
{
|
||||||
|
StreamString reply;
|
||||||
|
if (SendCommandGAM(CONTROL_PORT, "CONFIG\n", reply)) {
|
||||||
|
printf("CONFIG response (len=%llu)\n", reply.Size());
|
||||||
|
if (StringHelper::SearchString(reply.Buffer(), "GAM1") !=
|
||||||
|
NULL_PTR(const char8 *) &&
|
||||||
|
StringHelper::SearchString(reply.Buffer(), "DebugService") !=
|
||||||
|
NULL_PTR(const char8 *) &&
|
||||||
|
StringHelper::SearchString(reply.Buffer(), "OK CONFIG") !=
|
||||||
|
NULL_PTR(const char8 *)) {
|
||||||
|
printf("SUCCESS: CONFIG rebuilt the configuration from the "
|
||||||
|
"registry.\n");
|
||||||
|
} else {
|
||||||
|
printf("FAILURE: CONFIG (auto-rebuild) reply missing expected "
|
||||||
|
"content.\n");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
printf("FAILURE: CONFIG command failed.\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
app->StopCurrentStateExecution();
|
||||||
|
ObjectRegistryDatabase::Instance()->Purge();
|
||||||
|
}
|
||||||
@@ -31,6 +31,8 @@ void RunValidationTest();
|
|||||||
void TestConfigCommands();
|
void TestConfigCommands();
|
||||||
void TestGAMSignalTracing();
|
void TestGAMSignalTracing();
|
||||||
void TestTreeCommand();
|
void TestTreeCommand();
|
||||||
|
void TestDebugCommands();
|
||||||
|
void TestDebugConfigAutoRebuild();
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
signal(SIGALRM, timeout_handler);
|
signal(SIGALRM, timeout_handler);
|
||||||
@@ -90,7 +92,15 @@ int main() {
|
|||||||
printf("\n--- Test 7: Custom MARTe Message (MSG) ---\n");
|
printf("\n--- Test 7: Custom MARTe Message (MSG) ---\n");
|
||||||
TestMessageCommand();
|
TestMessageCommand();
|
||||||
Sleep::MSec(1000);
|
Sleep::MSec(1000);
|
||||||
|
|
||||||
|
printf("\n--- Test 8: FORCE/UNFORCE/BREAK/STEP/STEP_STATUS/VALUE/LS Commands ---\n");
|
||||||
|
TestDebugCommands();
|
||||||
|
Sleep::MSec(1000);
|
||||||
|
|
||||||
|
printf("\n--- Test 9: CONFIG Auto-Rebuild From Registry ---\n");
|
||||||
|
TestDebugConfigAutoRebuild();
|
||||||
|
Sleep::MSec(1000);
|
||||||
|
|
||||||
printf("\nAll Integration Tests Finished.\n");
|
printf("\nAll Integration Tests Finished.\n");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
OBJSX = SchedulerTest.x TraceTest.x ValidationTest.x ConfigCommandTest.x TreeCommandTest.x MessageCommandTest.x TestCommon.x
|
OBJSX = SchedulerTest.x TraceTest.x ValidationTest.x ConfigCommandTest.x TreeCommandTest.x MessageCommandTest.x DebugCommandsTest.x TestCommon.x
|
||||||
|
|
||||||
PACKAGE = Test/Integration
|
PACKAGE = Test/Integration
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
#include "StandardParser.h"
|
#include "StandardParser.h"
|
||||||
#include "StreamString.h"
|
#include "StreamString.h"
|
||||||
#include "GlobalObjectsDatabase.h"
|
#include "GlobalObjectsDatabase.h"
|
||||||
|
#include "TestCommon.h"
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
@@ -150,15 +151,11 @@ void TestSchedulerControl() {
|
|||||||
BasicUDPSocket listener;
|
BasicUDPSocket listener;
|
||||||
listener.Open();
|
listener.Open();
|
||||||
listener.Listen(8099);
|
listener.Listen(8099);
|
||||||
|
GrowUDPRecvBuffer(listener);
|
||||||
|
|
||||||
// Read current value
|
// Read current value
|
||||||
uint32 valBeforePause = 0;
|
uint32 valBeforePause = 0;
|
||||||
char buffer[2048];
|
if (ReadUDPSTraceScalar(listener, 1000, valBeforePause)) {
|
||||||
uint32 size = 2048;
|
|
||||||
TimeoutType timeout(1000);
|
|
||||||
if (listener.Read(buffer, size, timeout)) {
|
|
||||||
// [Header][ID][Size][Value]
|
|
||||||
valBeforePause = *(uint32 *)(&buffer[sizeof(TraceHeader) + 16]);
|
|
||||||
printf("Value before/at pause: %u\n", valBeforePause);
|
printf("Value before/at pause: %u\n", valBeforePause);
|
||||||
} else {
|
} else {
|
||||||
printf("WARNING: No data received before pause.\n");
|
printf("WARNING: No data received before pause.\n");
|
||||||
@@ -194,10 +191,11 @@ void TestSchedulerControl() {
|
|||||||
|
|
||||||
// Read again - should be same or very close if paused
|
// Read again - should be same or very close if paused
|
||||||
uint32 valAfterWait = 0;
|
uint32 valAfterWait = 0;
|
||||||
size = 2048; // Reset size
|
{
|
||||||
while (listener.Read(buffer, size, TimeoutType(100))) {
|
uint32 v;
|
||||||
valAfterWait = *(uint32 *)(&buffer[sizeof(TraceHeader) + 16]);
|
while (ReadUDPSTraceScalar(listener, 100, v)) {
|
||||||
size = 2048;
|
valAfterWait = v;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("Value after 2s wait (drained): %u\n", valAfterWait);
|
printf("Value after 2s wait (drained): %u\n", valAfterWait);
|
||||||
@@ -237,9 +235,7 @@ void TestSchedulerControl() {
|
|||||||
|
|
||||||
// Check if increasing
|
// Check if increasing
|
||||||
uint32 valAfterResume = 0;
|
uint32 valAfterResume = 0;
|
||||||
size = 2048;
|
if (ReadUDPSTraceScalar(listener, 1000, valAfterResume)) {
|
||||||
if (listener.Read(buffer, size, timeout)) {
|
|
||||||
valAfterResume = *(uint32 *)(&buffer[sizeof(TraceHeader) + 16]);
|
|
||||||
printf("Value after resume: %u\n", valAfterResume);
|
printf("Value after resume: %u\n", valAfterResume);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,10 @@
|
|||||||
#include "TestCommon.h"
|
#include "TestCommon.h"
|
||||||
#include "BasicTCPSocket.h"
|
#include "BasicTCPSocket.h"
|
||||||
|
#include "HighResolutionTimer.h"
|
||||||
#include "StringHelper.h"
|
#include "StringHelper.h"
|
||||||
#include "TimeoutType.h"
|
#include "TimeoutType.h"
|
||||||
|
#include "UDPSProtocol.h"
|
||||||
|
#include <sys/socket.h>
|
||||||
|
|
||||||
namespace MARTe {
|
namespace MARTe {
|
||||||
|
|
||||||
@@ -71,4 +74,43 @@ bool SendCommandGAM(uint16 port, const char8* cmd, StreamString &reply) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ReadUDPSTraceScalar(BasicUDPSocket &sock, uint32 overallTimeoutMs, uint32 &value) {
|
||||||
|
uint64 start = HighResolutionTimer::Counter();
|
||||||
|
float64 budgetS = (float64)overallTimeoutMs / 1000.0;
|
||||||
|
uint32 quantumMs = (overallTimeoutMs < 50u) ? overallTimeoutMs : 50u;
|
||||||
|
if (quantumMs == 0u) quantumMs = 1u;
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
float64 elapsed = (float64)(HighResolutionTimer::Counter() - start) * HighResolutionTimer::Period();
|
||||||
|
if (elapsed >= budgetS) break;
|
||||||
|
|
||||||
|
char buffer[2048];
|
||||||
|
uint32 size = 2048;
|
||||||
|
TimeoutType timeout(quantumMs);
|
||||||
|
if (sock.Read(buffer, size, timeout)) {
|
||||||
|
if (size >= UDPS_HEADER_SIZE) {
|
||||||
|
UDPSPacketHeader hdr;
|
||||||
|
memcpy(&hdr, buffer, UDPS_HEADER_SIZE);
|
||||||
|
if (hdr.magic == UDPS_MAGIC && hdr.type == UDPS_TYPE_DATA) {
|
||||||
|
uint32 off = UDPS_HEADER_SIZE + 8u; // skip 8-byte HRT timestamp
|
||||||
|
if (size >= off + sizeof(uint32)) {
|
||||||
|
memcpy(&value, buffer + off, sizeof(uint32));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// CONFIG packet, undersized datagram, or bad magic — keep polling.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GrowUDPRecvBuffer(BasicUDPSocket &sock, uint32 bytes) {
|
||||||
|
Handle fd = sock.GetReadHandle();
|
||||||
|
if (fd >= 0) {
|
||||||
|
int32 sz = static_cast<int32>(bytes);
|
||||||
|
setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &sz, sizeof(sz));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#ifndef TESTCOMMON_H
|
#ifndef TESTCOMMON_H
|
||||||
#define TESTCOMMON_H
|
#define TESTCOMMON_H
|
||||||
|
|
||||||
|
#include "BasicUDPSocket.h"
|
||||||
#include "CompilerTypes.h"
|
#include "CompilerTypes.h"
|
||||||
#include "StreamString.h"
|
#include "StreamString.h"
|
||||||
|
|
||||||
@@ -8,6 +9,48 @@ namespace MARTe {
|
|||||||
extern const char8 * const debug_test_config;
|
extern const char8 * const debug_test_config;
|
||||||
bool SendCommandGAM(uint16 port, const char8* cmd, StreamString &reply);
|
bool SendCommandGAM(uint16 port, const char8* cmd, StreamString &reply);
|
||||||
void TestMessageCommand();
|
void TestMessageCommand();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Reads DebugService trace telemetry off @p sock until a real
|
||||||
|
* UDPS DATA packet (Common/UDP/UDPSProtocol.h) is decoded or
|
||||||
|
* @p overallTimeoutMs elapses, and extracts the value of the first
|
||||||
|
* (and, for these single-signal integration tests, only) traced
|
||||||
|
* signal — a scalar at wire offset 0, right after the 8-byte HRT
|
||||||
|
* timestamp that opens every DATA payload.
|
||||||
|
*
|
||||||
|
* DebugService's real UDP telemetry (DebugService::Streamer) speaks the
|
||||||
|
* shared UDPS protocol, not the legacy TraceHeader format declared in
|
||||||
|
* DebugCore.h (that struct is now dead code, kept only for historical
|
||||||
|
* reference) — callers must not reinterpret raw datagrams as
|
||||||
|
* TraceHeader. CONFIG packets (sent once when the traced-signal set
|
||||||
|
* changes) are silently skipped so callers don't need to special-case
|
||||||
|
* them.
|
||||||
|
*
|
||||||
|
* @param sock DebugService's StreamPort/UdpPort listener, already Open()+Listen()ed.
|
||||||
|
* @param overallTimeoutMs total time budget across all read attempts.
|
||||||
|
* @param value output: the decoded scalar value.
|
||||||
|
* @return true if a DATA packet was decoded within the budget.
|
||||||
|
*/
|
||||||
|
bool ReadUDPSTraceScalar(BasicUDPSocket &sock, uint32 overallTimeoutMs, uint32 &value);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Grows the OS receive buffer (SO_RCVBUF) on an already-Open()ed
|
||||||
|
* UDP socket.
|
||||||
|
*
|
||||||
|
* BasicUDPSocket never touches SO_RCVBUF, so listeners are left at the
|
||||||
|
* Linux default (net.core.rmem_default, ~208 KiB on most systems). At
|
||||||
|
* sustained 1 kHz+ trace rates a single scheduling delay in the test
|
||||||
|
* process (e.g. a printf, a GC pass, or just being descheduled) is
|
||||||
|
* enough to overflow that default buffer, causing silent kernel-level
|
||||||
|
* datagram drops (visible as RcvbufErrors in /proc/net/snmp) that show
|
||||||
|
* up as false "discontinuities" even though DebugService sent every
|
||||||
|
* sample. UDPSClient already works around this for production code
|
||||||
|
* (UDPSClient::SetRecvBufferSize); integration tests that Listen()
|
||||||
|
* directly on a raw BasicUDPSocket need the same treatment.
|
||||||
|
*
|
||||||
|
* Best-effort: a failure here just leaves the OS default in place.
|
||||||
|
*/
|
||||||
|
void GrowUDPRecvBuffer(BasicUDPSocket &sock, uint32 bytes = 4194304u);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
#include "StandardParser.h"
|
#include "StandardParser.h"
|
||||||
#include "StreamString.h"
|
#include "StreamString.h"
|
||||||
#include "HighResolutionTimer.h"
|
#include "HighResolutionTimer.h"
|
||||||
|
#include "TestCommon.h"
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
@@ -31,14 +32,19 @@ void TestFullTracePipeline() {
|
|||||||
assert(sig != NULL_PTR(DebugSignalInfo*));
|
assert(sig != NULL_PTR(DebugSignalInfo*));
|
||||||
printf("Signal registered with ID: %u\n", sig->internalID);
|
printf("Signal registered with ID: %u\n", sig->internalID);
|
||||||
|
|
||||||
// 3. Enable Trace manually
|
// 3. Enable Trace via the real API (DebugService::TraceSignal), not by
|
||||||
sig->isTracing = true;
|
// poking isTracing directly — DebugService's override also flags
|
||||||
sig->decimationFactor = 1;
|
// udpsConfigPending so the streamer thread rebuilds its UDPS slot table
|
||||||
|
// and CONFIG packet. Without that, the streamer's anyData/slot-match
|
||||||
|
// logic (DebugService.cpp Streamer()) never finds a slot for this
|
||||||
|
// signal's samples and silently never sends any DATA packet at all.
|
||||||
|
assert(service.TraceSignal("TraceTest.Signal", true, 1) == 1u);
|
||||||
|
|
||||||
// 4. Setup a local UDP listener
|
// 4. Setup a local UDP listener
|
||||||
BasicUDPSocket listener;
|
BasicUDPSocket listener;
|
||||||
assert(listener.Open());
|
assert(listener.Open());
|
||||||
assert(listener.Listen(8083));
|
assert(listener.Listen(8083));
|
||||||
|
GrowUDPRecvBuffer(listener);
|
||||||
|
|
||||||
// 5. Simulate cycles
|
// 5. Simulate cycles
|
||||||
printf("Simulating cycles...\n");
|
printf("Simulating cycles...\n");
|
||||||
@@ -49,29 +55,10 @@ void TestFullTracePipeline() {
|
|||||||
Sleep::MSec(10);
|
Sleep::MSec(10);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 6. Try to read from UDP
|
// 6. Try to read a real UDPS DATA packet from UDP
|
||||||
char buffer[2048];
|
uint32 val = 0;
|
||||||
uint32 size = 2048;
|
if (ReadUDPSTraceScalar(listener, 2000, val)) {
|
||||||
TimeoutType timeout(1000); // 1s
|
printf("SUCCESS: Received UDPS DATA packet! Value=%u\n", val);
|
||||||
if (listener.Read(buffer, size, timeout)) {
|
|
||||||
printf("SUCCESS: Received %u bytes over UDP!\n", size);
|
|
||||||
|
|
||||||
TraceHeader *h = (TraceHeader*)buffer;
|
|
||||||
printf("Header: Magic=0x%X, Count=%u, Seq=%u\n", h->magic, h->count, h->seq);
|
|
||||||
|
|
||||||
uint32 offset = sizeof(TraceHeader);
|
|
||||||
if (size >= offset + 16) {
|
|
||||||
uint32 recId = *(uint32*)(&buffer[offset]);
|
|
||||||
uint64 recTs = *(uint64*)(&buffer[offset + 4]);
|
|
||||||
uint32 recSize = *(uint32*)(&buffer[offset + 12]);
|
|
||||||
printf("Data: ID=%u, TS=%llu, Size=%u\n", recId, (unsigned long long)recTs, recSize);
|
|
||||||
if (size >= offset + 16 + recSize) {
|
|
||||||
if (recSize == 4) {
|
|
||||||
uint32 recVal = *(uint32*)(&buffer[offset + 16]);
|
|
||||||
printf("Value=%u\n", recVal);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
printf("FAILURE: No UDP packets received.\n");
|
printf("FAILURE: No UDP packets received.\n");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
#include "StandardParser.h"
|
#include "StandardParser.h"
|
||||||
#include "StreamString.h"
|
#include "StreamString.h"
|
||||||
#include "GlobalObjectsDatabase.h"
|
#include "GlobalObjectsDatabase.h"
|
||||||
|
#include "TestCommon.h"
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
@@ -111,6 +112,7 @@ void RunValidationTest() {
|
|||||||
BasicUDPSocket listener;
|
BasicUDPSocket listener;
|
||||||
listener.Open();
|
listener.Open();
|
||||||
listener.Listen(8086);
|
listener.Listen(8086);
|
||||||
|
GrowUDPRecvBuffer(listener);
|
||||||
|
|
||||||
printf("Validating for 10 seconds...\n");
|
printf("Validating for 10 seconds...\n");
|
||||||
uint32 totalPackets = 0;
|
uint32 totalPackets = 0;
|
||||||
@@ -121,25 +123,14 @@ void RunValidationTest() {
|
|||||||
uint64 start = HighResolutionTimer::Counter();
|
uint64 start = HighResolutionTimer::Counter();
|
||||||
float64 elapsed = 0;
|
float64 elapsed = 0;
|
||||||
while (elapsed < 10.0) {
|
while (elapsed < 10.0) {
|
||||||
char buffer[2048];
|
uint32 val;
|
||||||
uint32 size = 2048;
|
if (ReadUDPSTraceScalar(listener, 100, val)) {
|
||||||
if (listener.Read(buffer, size, TimeoutType(100))) {
|
|
||||||
totalPackets++;
|
totalPackets++;
|
||||||
TraceHeader *h = (TraceHeader*)buffer;
|
totalSamples++;
|
||||||
uint32 offset = sizeof(TraceHeader);
|
if (lastValue != 0xFFFFFFFF && val != lastValue + 1) {
|
||||||
for (uint32 i=0; i<h->count; i++) {
|
discontinuities++;
|
||||||
uint32 recId = *(uint32*)(&buffer[offset]);
|
|
||||||
uint32 recSize = *(uint32*)(&buffer[offset + 12]);
|
|
||||||
if (recSize == 4) {
|
|
||||||
uint32 val = *(uint32*)(&buffer[offset + 16]);
|
|
||||||
totalSamples++;
|
|
||||||
if (lastValue != 0xFFFFFFFF && val != lastValue + 1) {
|
|
||||||
discontinuities++;
|
|
||||||
}
|
|
||||||
lastValue = val;
|
|
||||||
}
|
|
||||||
offset += (16 + recSize);
|
|
||||||
}
|
}
|
||||||
|
lastValue = val;
|
||||||
}
|
}
|
||||||
elapsed = (float64)(HighResolutionTimer::Counter() - start) * HighResolutionTimer::Period();
|
elapsed = (float64)(HighResolutionTimer::Counter() - start) * HighResolutionTimer::Period();
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,237 @@
|
|||||||
|
# Unified test/E2E/reporting/coverage pipeline — design
|
||||||
|
|
||||||
|
Date: 2026-07-01
|
||||||
|
|
||||||
|
## Problem
|
||||||
|
|
||||||
|
Test/coverage/reporting infrastructure is fragmented across at least seven
|
||||||
|
independent entry points with no shared report:
|
||||||
|
|
||||||
|
- `Test/E2E/chain/run_chain_e2e.sh` — the mature suite: 51-scenario matrix,
|
||||||
|
`collect.py` (C++ GTest, C++ Integration, 3x Go, Python), lcov coverage,
|
||||||
|
`report_build.py` → `report_data.json`/`history.jsonl`, Typst PDF.
|
||||||
|
- `Test/E2E/chain/run_stress.sh` (+`stress.py`/`stress_run.py`) — a 27-case
|
||||||
|
scaling matrix, fully standalone, own JSON/PNG output, no report/history
|
||||||
|
integration. A design+plan+branch (`feature/stress-report-integration`)
|
||||||
|
already exists for wiring it in but never landed on `main` and has since
|
||||||
|
diverged (predates the `UDPStreamerClient` test dir and `DebugServiceGTest`
|
||||||
|
additions).
|
||||||
|
- `Test/E2E/streamhub/` (Go smoke test) + root `run_e2e_test.sh` — a strict
|
||||||
|
subset of what `Test/E2E/chain/client` already checks.
|
||||||
|
- `Test/E2E/datasources/` (+`run_e2e_report.sh`, its own `E2E_Report.typ`) —
|
||||||
|
narrower UDPStreamer↔UDPStreamerClient direct round-trip predecessor to the
|
||||||
|
chain suite; has a stale synthetic (`np.random`) latency histogram in its
|
||||||
|
report generation.
|
||||||
|
- `Test/E2E/recorder/` (+`run_recorder_e2e.sh`) — BinaryRecorder disk-output
|
||||||
|
check, depends on `datasources/`'s generator/validator by relative path.
|
||||||
|
- `run_combined_test.sh` — manual, no-assertion demo launcher for the
|
||||||
|
DebugService + TCPLogger + UDPStreamer combined config.
|
||||||
|
- TCPLogger has **zero** automated tests of any kind today.
|
||||||
|
|
||||||
|
Additionally, `Test/Applications/StreamHub`'s build is currently broken:
|
||||||
|
two untracked GTest files (`BoundsCheckTest.cpp`, `WSServerBufferTest.cpp` —
|
||||||
|
regression tests for `BUG_FIX_PLAN.md` items HI-1/HI-4/CR-1) `#include
|
||||||
|
<cstdint>`, which fails under the project's `-std=c++98` build even during a
|
||||||
|
bare `-MM` dependency scan (MARTe2's generic `dependsRaw` rule globs *all*
|
||||||
|
`.cpp` files in a test dir regardless of `OBJSX` membership). This currently
|
||||||
|
breaks `make test` repo-wide.
|
||||||
|
|
||||||
|
Coverage is also incomplete: it's rebuilt and collected *after* E2E scenarios
|
||||||
|
already ran on normal (non-instrumented) binaries, so none of the code paths
|
||||||
|
scenarios actually exercise count toward the C++ coverage percentage.
|
||||||
|
|
||||||
|
## Goal
|
||||||
|
|
||||||
|
One command, one report. Running `Test/E2E/suite/run_e2e.sh` (renamed from
|
||||||
|
`run_chain_e2e.sh`) executes every test suite in the repo — unit tests
|
||||||
|
(GTest, Integration), the chain/stress/datasources/recorder/debug/tcplogger
|
||||||
|
E2E scenario families, and Go/Python framework tests — and produces one
|
||||||
|
`results.json`, one `unit_tests.json`/`coverage.json`, and one
|
||||||
|
`report_data.json`/`history.jsonl`/Typst PDF covering all of it, with
|
||||||
|
accurate coverage (including E2E-exercised code) and uncontaminated
|
||||||
|
performance metrics.
|
||||||
|
|
||||||
|
## Non-goals
|
||||||
|
|
||||||
|
- No changes to the actual product code paths being tested (this is
|
||||||
|
test-infrastructure-only), except the minimal `<cstdint>` → MARTe2-types
|
||||||
|
fix needed to unblock the build.
|
||||||
|
- No new CI wiring (out of scope; this only needs to produce artifacts a CI
|
||||||
|
job *could* consume later).
|
||||||
|
- No decision here about merging/resolving `BUG_FIX_PLAN.md`'s broader
|
||||||
|
remediation phases — only unblocking the two orphaned test files enough to
|
||||||
|
compile and run as part of the unified suite.
|
||||||
|
|
||||||
|
## Design
|
||||||
|
|
||||||
|
### 1. Layout and entry point
|
||||||
|
|
||||||
|
- `Test/E2E/chain/` → `Test/E2E/suite/` (git `mv`), `run_chain_e2e.sh` →
|
||||||
|
`run_e2e.sh`. `CLAUDE.md`/`AGENTS.md` references updated.
|
||||||
|
- New flags on `run_e2e.sh`: `--skip-coverage`, `--skip-stress`,
|
||||||
|
`--skip-datasources`, `--skip-recorder`, `--skip-debug`,
|
||||||
|
`--skip-tcplogger` (all six suites run by default; existing
|
||||||
|
`--skip-build`/`--only`/`--pdf-only`/`--cpp-coverage` retained,
|
||||||
|
`--cpp-coverage` now governs the single instrumented phase below instead
|
||||||
|
of a second rebuild).
|
||||||
|
- `Test/E2E/datasources/` and `Test/E2E/recorder/` directories stay in place
|
||||||
|
(cfgs, `gen_test_data.py`, `validate_binary.py`); `run_e2e.sh` imports them
|
||||||
|
as Python modules (same pattern it already uses for `scenarios`/
|
||||||
|
`gen_data`/`gen_cfg`/`validate_waveform`).
|
||||||
|
- Deleted: `Test/E2E/streamhub/` (dir + Go module/binary), root
|
||||||
|
`run_e2e_test.sh`, `Test/E2E/datasources/run_e2e_report.sh` + its
|
||||||
|
standalone `E2E_Report.typ`, `Test/E2E/recorder/run_recorder_e2e.sh`, root
|
||||||
|
`run_combined_test.sh`.
|
||||||
|
|
||||||
|
### 2. Build & coverage flow
|
||||||
|
|
||||||
|
Flow when coverage is enabled (default):
|
||||||
|
|
||||||
|
1. Build **normal** binaries (`make core apps` + test dirs, no
|
||||||
|
`--coverage`), unless `--skip-build`.
|
||||||
|
2. **Authoritative pass**: run chain + datasources + recorder + debug +
|
||||||
|
tcplogger scenarios (any not individually skipped) on normal binaries.
|
||||||
|
This is the sole source of `results.json` (pass/fail/oracle) and
|
||||||
|
`perf_*.json` (cpu/RSS/throughput — unchanged from today, feeds
|
||||||
|
`trend_perf.png`/regression).
|
||||||
|
3. Run the **stress matrix** (unless `--skip-stress`) on the same normal
|
||||||
|
binaries. Stress is *never* instrumented, regardless of
|
||||||
|
`--skip-coverage`, because gcov overhead skews its scaling/perf
|
||||||
|
measurements.
|
||||||
|
4. Rebuild **instrumented** binaries (`--coverage`): `core`, `apps`, and test
|
||||||
|
dirs (`Test/GTest`, `Test/Integration`, `Test/Components/DataSources/
|
||||||
|
UDPStreamer{,Client}`, `Test/Applications/StreamHub`).
|
||||||
|
5. Re-run chain + datasources + recorder + debug + tcplogger scenarios on
|
||||||
|
instrumented binaries for **coverage accumulation only**. Their pass/fail
|
||||||
|
is compared against step 2's results as a sanity check (a mismatch is
|
||||||
|
logged as a warning, not a report-blocking failure — it flags
|
||||||
|
nondeterminism without duplicating the correctness gate); their perf
|
||||||
|
metrics are discarded.
|
||||||
|
6. Run C++ GTest + Integration (instrumented) and the Go/Python suites
|
||||||
|
(unaffected by instrumentation, run once).
|
||||||
|
7. Collect coverage once (`lcov --capture` + `--extract Source/* Test/*`,
|
||||||
|
same restricted scope as today), aggregating gcov data from steps 5 and 6.
|
||||||
|
8. Restore a clean, non-instrumented `core apps` build so the repo ends in
|
||||||
|
its normal runnable state.
|
||||||
|
|
||||||
|
When `--skip-coverage`: steps 4/5/7 are skipped; step 6 runs GTest/
|
||||||
|
Integration once on normal binaries; `coverage.json`/the report's coverage
|
||||||
|
section is marked `"skipped": true`.
|
||||||
|
|
||||||
|
### 3. Unified scenario model
|
||||||
|
|
||||||
|
`scenarios.py` entries gain a `kind` field:
|
||||||
|
|
||||||
|
- `"chain"` — the existing 51 scenarios, unchanged.
|
||||||
|
- `"direct"` — new; the 2 existing datasources cfgs (`E2ETest.cfg`,
|
||||||
|
`E2EMulticastTest.cfg`), UDPStreamer→UDPStreamerClient only, no
|
||||||
|
StreamHub/WS hop, validated via `validate_binary.py` (byte-identical
|
||||||
|
round-trip).
|
||||||
|
- `"recorder"` — new; `RecorderStreamer.cfg`/`StreamHubRec.cfg`, chain path
|
||||||
|
+ `BinaryRecorder`, validated via `validate_binary.py` against the
|
||||||
|
recorded disk file.
|
||||||
|
- `"debug"` — new; see §4.
|
||||||
|
- `"tcplogger"` — new; see §4.
|
||||||
|
|
||||||
|
`run_e2e.sh`'s per-scenario loop dispatches on `kind`: `chain` keeps today's
|
||||||
|
launch/record/validate sequence; `direct` skips the StreamHub/chain-client
|
||||||
|
hop (launch `MARTeApp.ex` with `UDPStreamerClient` receiving directly, then
|
||||||
|
byte-compare); `recorder` runs the chain sequence plus a post-run disk-file
|
||||||
|
check; `debug`/`tcplogger` launch `MARTeApp.ex` with a DebugService/TCPLogger
|
||||||
|
config and drive it with `debugclient` (§4). All five write into the same
|
||||||
|
`results.json` (with `kind` as a discriminator field), so `known_issue`/
|
||||||
|
XFAIL/XPASS handling and PASS/FAIL aggregation need no branching beyond
|
||||||
|
dispatch.
|
||||||
|
|
||||||
|
Stress stays structurally separate (`stress_results.json`, produced by
|
||||||
|
`stress_run.py` as today, read by `report_build.py` as a distinct input —
|
||||||
|
the same pattern already used for `perf_*.json`), because it's a scaling
|
||||||
|
matrix, not a per-signal pass/fail scenario.
|
||||||
|
|
||||||
|
### 4. DebugService & TCPLogger E2E scenarios
|
||||||
|
|
||||||
|
`Client/debugger/martecontrol.go`'s `MarteController` already implements the
|
||||||
|
needed protocol clients as library code: `Connect`/`runTCP`/`SendCommand`
|
||||||
|
(TCP 8080 command protocol), `runDebugUDP` (UDP 8081 trace telemetry), and
|
||||||
|
`runLog` (TCP 8082 TCPLogger stream) — currently wired to a WebSocket hub for
|
||||||
|
the browser UI. Refactor the hub-broadcast calls behind a small callback
|
||||||
|
interface so this logic is reusable headless, and add a new Go binary
|
||||||
|
`Test/E2E/suite/debugclient/` that imports it, scripted instead of
|
||||||
|
browser-driven.
|
||||||
|
|
||||||
|
- **`kind="debug"`**: launch `MARTeApp.ex` with a DebugService config derived
|
||||||
|
from `Test/Configurations/combined_test.cfg` (trimmed to what's needed).
|
||||||
|
`debugclient` connects to TCP 8080 + UDP 8081 and scripts a sequence
|
||||||
|
(force a signal, arm a breakpoint, trace a signal) mirroring what
|
||||||
|
`Test/Integration`'s `TraceTest.cpp`/`ValidationTest.cpp` already exercise
|
||||||
|
in-process — but validated end-to-end as a separate OS process pair over
|
||||||
|
real sockets, catching wire-format/serialization bugs the in-process suite
|
||||||
|
cannot.
|
||||||
|
- **`kind="tcplogger"`**: same launch, `debugclient` connects to TCP 8082,
|
||||||
|
triggers known log-worthy events (a forced value, a config error), asserts
|
||||||
|
expected log lines arrive with correct formatting/ordering.
|
||||||
|
- Both are functional (pass/fail), not perf-sensitive: they follow the
|
||||||
|
chain/datasources/recorder double-run pattern from §2 for coverage
|
||||||
|
consistency, but skip `proc_perf.py` capture.
|
||||||
|
- `run_combined_test.sh` becomes redundant once these scenarios exist and is
|
||||||
|
retired, folding its config into the new scenario cfgs.
|
||||||
|
|
||||||
|
### 5. Reporting
|
||||||
|
|
||||||
|
`E2E_Report.typ`/`report_data.json` gain sections alongside the existing
|
||||||
|
Progression/Unit tests/Coverage/Performance/Scenarios: **Stress Tests**
|
||||||
|
(per-axis scaling tables/plots + regression, per the existing
|
||||||
|
`2026-06-26-stress-suite-report-integration-design.md`), **Direct
|
||||||
|
Round-Trip** (datasources pass/fail table), **Recorder** (pass/fail table),
|
||||||
|
**Debug Service E2E** and **TCPLogger E2E** (pass/fail per scenario).
|
||||||
|
`history.jsonl`/`headline()`/`regression()` extended with fields from each
|
||||||
|
new section so trend plots and regression-vs-previous-run cover everything
|
||||||
|
in one place.
|
||||||
|
|
||||||
|
### 6. `Test/Applications/StreamHub` build fix
|
||||||
|
|
||||||
|
`BoundsCheckTest.cpp`/`WSServerBufferTest.cpp` replace `#include <cstdint>`
|
||||||
|
with MARTe2 types (`uint8`/`uint32`/etc. from `GeneralDefinitions.h`),
|
||||||
|
matching the sibling GTest files' style and the repo's MARTe2-style
|
||||||
|
convention. Both are registered in `Makefile.inc`'s `OBJSX` (as
|
||||||
|
`BoundsCheckTest.x`/`WSServerBufferTest.x`) alongside the existing four
|
||||||
|
GTest `.x` entries, so they compile deliberately rather than only being
|
||||||
|
incidentally scanned by the `-MM` dependency glob.
|
||||||
|
|
||||||
|
### 7. Stale branch reconciliation
|
||||||
|
|
||||||
|
`git diff main...feature/stress-report-integration` shows a concrete,
|
||||||
|
mostly-still-relevant 8-commit diff (`report_build.py` +124/-lines,
|
||||||
|
`run_chain_e2e.sh` +27, `stress.py` +69 for the multi-fragment size-axis
|
||||||
|
extension, plus a new `test_report_stress.py`, a `CLAUDE.md` doc line, and a
|
||||||
|
stray `TODO.md`). Port the relevant logic (stress table/plots/regression
|
||||||
|
wiring, the multi-fragment size-axis fix) onto current `main` as part of
|
||||||
|
implementing §5, adapting for the scenario-model/build-flow changes in this
|
||||||
|
spec (the branch predates both). Once superseded, delete the branch (local +
|
||||||
|
`origin`) — confirm before deleting the remote ref.
|
||||||
|
|
||||||
|
## Testing
|
||||||
|
|
||||||
|
- All 76 existing GTests plus the two newly-registered ones must pass.
|
||||||
|
- Full `run_e2e.sh` (default flags) must complete with `results.json`
|
||||||
|
reporting pass for all scenario kinds, `stress_results.json` produced,
|
||||||
|
`coverage.json` showing a higher C++ % than today's GTest/Integration-only
|
||||||
|
baseline, and a single `E2E_Report.pdf` containing all six sections.
|
||||||
|
- `run_e2e.sh --skip-coverage --skip-stress --only <id>` must still work for
|
||||||
|
fast single-scenario iteration (unchanged developer workflow).
|
||||||
|
- `Test/E2E/chain/tests_py.py` (framework self-tests) extended to cover the
|
||||||
|
new `kind` dispatch logic and the `direct`/`recorder`/`debug`/`tcplogger`
|
||||||
|
scenario definitions the same way it already covers `chain` scenarios.
|
||||||
|
|
||||||
|
## Risks
|
||||||
|
|
||||||
|
- Double-running chain/datasources/recorder/debug/tcplogger scenarios for
|
||||||
|
coverage roughly doubles that portion of total E2E wall-clock time (stress
|
||||||
|
is unaffected, running once).
|
||||||
|
- Refactoring `MarteController` to be headless-usable touches
|
||||||
|
`Client/debugger`'s production code, not just test infra — needs care not
|
||||||
|
to regress the browser UI.
|
||||||
|
- The `feature/stress-report-integration` branch's `stress.py` multi-fragment
|
||||||
|
extension needs re-validation against the current `UDPSClient` 1 MiB
|
||||||
|
reassembly cap mentioned in its own design doc, since main has moved on
|
||||||
|
since that branch diverged.
|
||||||
@@ -1,145 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# run_combined_test.sh — launch the combined integration test
|
|
||||||
#
|
|
||||||
# Usage:
|
|
||||||
# ./run_combined_test.sh [OPTIONS]
|
|
||||||
#
|
|
||||||
# Options:
|
|
||||||
# -m <MARTe2_DIR> Override MARTe2 installation dir (default: $MARTe2_DIR)
|
|
||||||
# -c <MARTe2_Components_DIR> Override MARTe2-components dir
|
|
||||||
# -b <BUILD_TARGET> Build target (default: x86-linux)
|
|
||||||
# -s Skip building — run with whatever is already built
|
|
||||||
# -d Start debugger web UI (marte2debugger) automatically
|
|
||||||
# -h Show this help
|
|
||||||
#
|
|
||||||
# Ports used:
|
|
||||||
# 44500/tcp+udp UDPStreamer1 control + data (scalar signals)
|
|
||||||
# 44501/tcp UDPStreamer2 control (packed arrays FirstSample/LastSample)
|
|
||||||
# 44502/tcp UDPStreamer3 control (packed arrays FullArray)
|
|
||||||
# 44503/udp UDPStreamer1 multicast data (239.0.0.1)
|
|
||||||
# 8080/tcp DebugService control
|
|
||||||
# 8081/udp DebugService UDPS stream
|
|
||||||
# 8082/tcp DebugService log
|
|
||||||
# 9090/tcp TCPLogger
|
|
||||||
# 7777/tcp Debugger web UI (if -d is given)
|
|
||||||
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
||||||
CFG="${SCRIPT_DIR}/Test/Configurations/combined_test.cfg"
|
|
||||||
|
|
||||||
BUILD_TARGET="${TARGET:-x86-linux}"
|
|
||||||
SKIP_BUILD=0
|
|
||||||
START_UI=0
|
|
||||||
|
|
||||||
# ── Parse arguments ───────────────────────────────────────────────────────────
|
|
||||||
while getopts "m:c:b:sdh" opt; do
|
|
||||||
case "$opt" in
|
|
||||||
m) MARTe2_DIR="$OPTARG" ;;
|
|
||||||
c) MARTe2_Components_DIR="$OPTARG" ;;
|
|
||||||
b) BUILD_TARGET="$OPTARG" ;;
|
|
||||||
s) SKIP_BUILD=1 ;;
|
|
||||||
d) START_UI=1 ;;
|
|
||||||
h)
|
|
||||||
sed -n '2,40p' "$0" | grep '^#' | sed 's/^# \?//'
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
*) echo "Unknown option: -$OPTARG" >&2; exit 1 ;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
# ── Validate environment ──────────────────────────────────────────────────────
|
|
||||||
if [[ -z "${MARTe2_DIR:-}" ]]; then
|
|
||||||
echo "ERROR: MARTe2_DIR is not set. Source env.sh first or pass -m <dir>."
|
|
||||||
echo " source ${SCRIPT_DIR}/env.sh"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -z "${MARTe2_Components_DIR:-}" ]]; then
|
|
||||||
echo "ERROR: MARTe2_Components_DIR is not set. Source env.sh first or pass -c <dir>."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
MARTE2_BIN="${MARTe2_DIR}/Build/${BUILD_TARGET}/App/MARTeApp.ex"
|
|
||||||
if [[ ! -x "$MARTE2_BIN" ]]; then
|
|
||||||
# Some builds use MARTe2.sh as the launcher wrapper
|
|
||||||
MARTE2_BIN="${MARTe2_DIR}/Build/${BUILD_TARGET}/App/MARTe2.sh"
|
|
||||||
fi
|
|
||||||
if [[ ! -x "$MARTE2_BIN" ]]; then
|
|
||||||
echo "ERROR: MARTe2 executable not found at ${MARTe2_DIR}/Build/${BUILD_TARGET}/App/"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# ── Build ─────────────────────────────────────────────────────────────────────
|
|
||||||
if [[ "$SKIP_BUILD" -eq 0 ]]; then
|
|
||||||
echo "==> Building components (TARGET=${BUILD_TARGET})..."
|
|
||||||
make -C "${SCRIPT_DIR}" -f Makefile.gcc TARGET="${BUILD_TARGET}" 2>&1 | tail -20
|
|
||||||
echo "==> Build done."
|
|
||||||
fi
|
|
||||||
|
|
||||||
# ── Library path ─────────────────────────────────────────────────────────────
|
|
||||||
BUILD_DIR="${SCRIPT_DIR}/Build/${BUILD_TARGET}"
|
|
||||||
|
|
||||||
export LD_LIBRARY_PATH="\
|
|
||||||
${MARTe2_DIR}/Build/${BUILD_TARGET}/Core:\
|
|
||||||
${MARTe2_Components_DIR}/Build/${BUILD_TARGET}/Components/DataSources/LinuxTimer:\
|
|
||||||
${MARTe2_Components_DIR}/Build/${BUILD_TARGET}/Components/DataSources/LoggerDataSource:\
|
|
||||||
${MARTe2_Components_DIR}/Build/${BUILD_TARGET}/Components/GAMs/IOGAM:\
|
|
||||||
${MARTe2_Components_DIR}/Build/${BUILD_TARGET}/Components/GAMs/WaveformGAM:\
|
|
||||||
${BUILD_DIR}/Components/DataSources/UDPStreamer:\
|
|
||||||
${BUILD_DIR}/Components/GAMs/SineArrayGAM:\
|
|
||||||
${BUILD_DIR}/Components/GAMs/TimeArrayGAM:\
|
|
||||||
${BUILD_DIR}/Components/Interfaces/DebugService:\
|
|
||||||
${BUILD_DIR}/Components/Interfaces/TCPLogger:\
|
|
||||||
${LD_LIBRARY_PATH:-}"
|
|
||||||
|
|
||||||
# ── Loader parameters ─────────────────────────────────────────────────────────
|
|
||||||
LOADER_PARAMS=(
|
|
||||||
-l RealTimeLoader
|
|
||||||
-f "${CFG}"
|
|
||||||
-s Running
|
|
||||||
-m StateMachine:START
|
|
||||||
)
|
|
||||||
|
|
||||||
# ── Optionally start the web UI ───────────────────────────────────────────────
|
|
||||||
UI_PID=""
|
|
||||||
if [[ "$START_UI" -eq 1 ]]; then
|
|
||||||
UI_BIN="${SCRIPT_DIR}/Client/debugger/marte2debugger"
|
|
||||||
echo "==> Building debugger web UI..."
|
|
||||||
(cd "${SCRIPT_DIR}/Client/debugger" && go build -o marte2debugger .)
|
|
||||||
# Check if port 7777 is already in use
|
|
||||||
if ss -tlnH sport = :7777 2>/dev/null | grep -q 7777; then
|
|
||||||
echo "==> Debugger web UI already running on http://localhost:7777"
|
|
||||||
else
|
|
||||||
echo "==> Starting debugger web UI on http://localhost:7777 ..."
|
|
||||||
"${UI_BIN}" -addr :7777 &
|
|
||||||
UI_PID="$!"
|
|
||||||
sleep 0.5
|
|
||||||
fi
|
|
||||||
echo " Open http://localhost:7777 in your browser."
|
|
||||||
echo " In the connection panel set:"
|
|
||||||
echo " Host=127.0.0.1 TCP=8080 UDP=8081 Log=9090"
|
|
||||||
echo ""
|
|
||||||
fi
|
|
||||||
|
|
||||||
# ── Cleanup handler ───────────────────────────────────────────────────────────
|
|
||||||
cleanup() {
|
|
||||||
echo ""
|
|
||||||
echo "==> Shutting down..."
|
|
||||||
if [[ -n "$UI_PID" ]] && kill -0 "$UI_PID" 2>/dev/null; then
|
|
||||||
kill "$UI_PID"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
trap cleanup EXIT INT TERM
|
|
||||||
|
|
||||||
# ── Launch MARTe2 ─────────────────────────────────────────────────────────────
|
|
||||||
echo "==> Launching MARTe2..."
|
|
||||||
echo " Config : ${CFG}"
|
|
||||||
echo " State : Running"
|
|
||||||
echo " Streams: UDPStreamer1=44500 UDPStreamer2=44501 UDPStreamer3=44502"
|
|
||||||
echo " Debug : TCP=8080 UDP=8081 Log=9090 (TcpLogger auto-injected)"
|
|
||||||
echo ""
|
|
||||||
echo " Press Ctrl-C to stop."
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
exec "${MARTE2_BIN}" "${LOADER_PARAMS[@]}"
|
|
||||||
-162
@@ -1,162 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# run_e2e_test.sh — End-to-end test of the streaming pipeline:
|
|
||||||
# MARTe2 app (UDPStreamer) → StreamHub (C++) → WebSocket client (Go)
|
|
||||||
#
|
|
||||||
# Launches the full stack headless, then runs Test/E2E/streamhub which
|
|
||||||
# verifies sources/config events, binary data pushes (wall-clock time base,
|
|
||||||
# per-signal monotonicity), stats, WS zoom round-trips and a hub-side
|
|
||||||
# trigger capture. Exits 0 iff every check passes.
|
|
||||||
#
|
|
||||||
# Usage:
|
|
||||||
# ./run_e2e_test.sh [OPTIONS]
|
|
||||||
#
|
|
||||||
# Options:
|
|
||||||
# -m <MARTe2_DIR> Override MARTe2 installation dir
|
|
||||||
# -c <MARTe2_Components_DIR> Override MARTe2-components dir
|
|
||||||
# -b <BUILD_TARGET> Build target (default: x86-linux)
|
|
||||||
# -p <WS_PORT> StreamHub WebSocket port (default: 8095)
|
|
||||||
# -s Skip building
|
|
||||||
# -h Show this help
|
|
||||||
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
||||||
MARTe_CFG="${SCRIPT_DIR}/Test/Configurations/streamhub_demo.cfg"
|
|
||||||
BUILD_TARGET="${TARGET:-x86-linux}"
|
|
||||||
WS_PORT=8095
|
|
||||||
SKIP_BUILD=0
|
|
||||||
|
|
||||||
while getopts "m:c:b:p:sh" opt; do
|
|
||||||
case "$opt" in
|
|
||||||
m) MARTe2_DIR="$OPTARG" ;;
|
|
||||||
c) MARTe2_Components_DIR="$OPTARG" ;;
|
|
||||||
b) BUILD_TARGET="$OPTARG" ;;
|
|
||||||
p) WS_PORT="$OPTARG" ;;
|
|
||||||
s) SKIP_BUILD=1 ;;
|
|
||||||
h)
|
|
||||||
sed -n '2,19p' "$0" | grep '^#' | sed 's/^# \?//'
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
*) echo "Unknown option: -$OPTARG" >&2; exit 1 ;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
if [[ -z "${MARTe2_DIR:-}" || -z "${MARTe2_Components_DIR:-}" ]]; then
|
|
||||||
echo "ERROR: MARTe2_DIR / MARTe2_Components_DIR not set. Source env.sh first."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
BUILD_DIR="${SCRIPT_DIR}/Build/${BUILD_TARGET}"
|
|
||||||
STREAMHUB_EX="${BUILD_DIR}/StreamHub/StreamHub.ex"
|
|
||||||
E2E_DIR="${SCRIPT_DIR}/Test/E2E/streamhub"
|
|
||||||
E2E_BIN="${E2E_DIR}/streamhub-e2e"
|
|
||||||
|
|
||||||
MARTE2_BIN="${MARTe2_DIR}/Build/${BUILD_TARGET}/App/MARTeApp.ex"
|
|
||||||
[[ -x "$MARTE2_BIN" ]] || MARTE2_BIN="${MARTe2_DIR}/Build/${BUILD_TARGET}/App/MARTe2.sh"
|
|
||||||
if [[ ! -x "$MARTE2_BIN" ]]; then
|
|
||||||
echo "ERROR: MARTe2 executable not found at ${MARTe2_DIR}/Build/${BUILD_TARGET}/App/"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# ── Build ─────────────────────────────────────────────────────────────────────
|
|
||||||
if [[ "$SKIP_BUILD" -eq 0 ]]; then
|
|
||||||
echo "==> Building MARTe2 components + StreamHub..."
|
|
||||||
make -C "${SCRIPT_DIR}" -f Makefile.gcc TARGET="${BUILD_TARGET}" core apps 2>&1 | tail -5
|
|
||||||
echo "==> Building E2E client..."
|
|
||||||
(cd "${E2E_DIR}" && go build -o streamhub-e2e .)
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ ! -x "$STREAMHUB_EX" ]]; then
|
|
||||||
echo "ERROR: StreamHub binary not found: ${STREAMHUB_EX}"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# ── StreamHub config ──────────────────────────────────────────────────────────
|
|
||||||
HUB_CFG="$(mktemp /tmp/streamhub_e2e_XXXXXX.cfg)"
|
|
||||||
cat > "$HUB_CFG" <<EOF
|
|
||||||
Hub = {
|
|
||||||
WSPort = ${WS_PORT}
|
|
||||||
MaxPoints = 20000
|
|
||||||
PushRate = 30
|
|
||||||
RingTemporal = 1000000
|
|
||||||
RingScalar = 100000
|
|
||||||
+History = {
|
|
||||||
Directory = "/tmp/streamhub_e2e_history"
|
|
||||||
DurationHours = 0.1
|
|
||||||
Decimation = 10
|
|
||||||
FlushIntervalSec = 2
|
|
||||||
MinDiskFreeMB = 100
|
|
||||||
}
|
|
||||||
Sources = {
|
|
||||||
scalar = {
|
|
||||||
Label = "Scalar Sines (1 ksps)"
|
|
||||||
Addr = "127.0.0.1"
|
|
||||||
Port = 44500
|
|
||||||
MulticastGroup = "239.0.0.1"
|
|
||||||
DataPort = 44503
|
|
||||||
}
|
|
||||||
med = {
|
|
||||||
Label = "1 Msps Sines (Ch1 1kHz, Ch2 5kHz)"
|
|
||||||
Addr = "127.0.0.1"
|
|
||||||
Port = 44501
|
|
||||||
}
|
|
||||||
fast = {
|
|
||||||
Label = "5 Msps Sines (Ch3 10kHz, Ch4 50kHz)"
|
|
||||||
Addr = "127.0.0.1"
|
|
||||||
Port = 44502
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
EOF
|
|
||||||
|
|
||||||
export LD_LIBRARY_PATH="\
|
|
||||||
${MARTe2_DIR}/Build/${BUILD_TARGET}/Core:\
|
|
||||||
${MARTe2_Components_DIR}/Build/${BUILD_TARGET}/Components/DataSources/LinuxTimer:\
|
|
||||||
${MARTe2_Components_DIR}/Build/${BUILD_TARGET}/Components/GAMs/IOGAM:\
|
|
||||||
${BUILD_DIR}/Components/DataSources/UDPStreamer:\
|
|
||||||
${BUILD_DIR}/Components/GAMs/SineArrayGAM:\
|
|
||||||
${BUILD_DIR}/Components/GAMs/TimeArrayGAM:\
|
|
||||||
${BUILD_DIR}/Components/Interfaces/UDPStream:\
|
|
||||||
${LD_LIBRARY_PATH:-}"
|
|
||||||
|
|
||||||
MARTE_PID=""
|
|
||||||
HUB_PID=""
|
|
||||||
RESULT=1
|
|
||||||
|
|
||||||
cleanup() {
|
|
||||||
[[ -n "$HUB_PID" ]] && kill "$HUB_PID" 2>/dev/null || true
|
|
||||||
[[ -n "$MARTE_PID" ]] && kill "$MARTE_PID" 2>/dev/null || true
|
|
||||||
wait "$HUB_PID" 2>/dev/null || true
|
|
||||||
wait "$MARTE_PID" 2>/dev/null || true
|
|
||||||
rm -f "$HUB_CFG"
|
|
||||||
if [[ "$RESULT" -eq 0 ]]; then
|
|
||||||
echo "==> E2E: PASS"
|
|
||||||
else
|
|
||||||
echo "==> E2E: FAIL"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
trap cleanup EXIT INT TERM
|
|
||||||
|
|
||||||
echo "==> Launching MARTe2 (headless)..."
|
|
||||||
"${MARTE2_BIN}" \
|
|
||||||
-l RealTimeLoader \
|
|
||||||
-f "${MARTe_CFG}" \
|
|
||||||
-s Running \
|
|
||||||
-m StateMachine:START > /tmp/streamhub_e2e_marte.log 2>&1 &
|
|
||||||
MARTE_PID="$!"
|
|
||||||
|
|
||||||
sleep 1
|
|
||||||
|
|
||||||
echo "==> Launching StreamHub (ws port ${WS_PORT})..."
|
|
||||||
"${STREAMHUB_EX}" -cfg "${HUB_CFG}" > /tmp/streamhub_e2e_hub.log 2>&1 &
|
|
||||||
HUB_PID="$!"
|
|
||||||
|
|
||||||
# Give the hub time to connect the UDPS sources and fill some history
|
|
||||||
sleep 3
|
|
||||||
|
|
||||||
echo "==> Running E2E client..."
|
|
||||||
if "${E2E_BIN}" -hub "127.0.0.1:${WS_PORT}" -timeout 60s; then
|
|
||||||
RESULT=0
|
|
||||||
fi
|
|
||||||
|
|
||||||
exit "$RESULT"
|
|
||||||
Reference in New Issue
Block a user