Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
158774a
added a conversion function from uri to iceorxy2 addressing scheme + …
catappreciationhours2 Jul 13, 2025
aa94194
Update src/lib.rs
catappreciationhours2 Jul 16, 2025
966803d
modified compute_service_name to accept source and sink instead of UM…
catappreciationhours2 Jul 16, 2025
8fe6511
added oft spec workflow
catappreciationhours2 Jul 16, 2025
c1e66f1
created workflow check
catappreciationhours2 Jul 16, 2025
f5af7d1
allow new branch to run on
catappreciationhours2 Jul 16, 2025
8435769
modified file name
catappreciationhours2 Jul 16, 2025
9b2504d
allow dead code
catappreciationhours2 Jul 16, 2025
56c0cfe
allow dead code
catappreciationhours2 Jul 16, 2025
41020a0
removed unused imports
catappreciationhours2 Jul 16, 2025
7033c26
retry with fixed email
catappreciationhours2 Jul 16, 2025
ef9f7fb
added a conversion function from uri to iceorxy2 addressing scheme + …
catappreciationhours2 Jul 13, 2025
f0d3f04
Update src/lib.rs
catappreciationhours2 Jul 16, 2025
d99be0c
modified compute_service_name to accept source and sink instead of UM…
catappreciationhours2 Jul 16, 2025
0f05535
Update src/lib.rs
catappreciationhours2 Jul 20, 2025
d71293a
modified to use helper function and use match for more clear pattern …
catappreciationhours2 Jul 20, 2025
d29b055
modified compute service name to use custom helper to determine messa…
catappreciationhours2 Jul 20, 2025
bb007c9
removed unwrap
catappreciationhours2 Jul 20, 2025
8fa1894
trying to get rid of eol errors
vidishac2004 Jul 23, 2025
dc2bbac
trying to get rid of build errors due to Ustatus::invalid_argument
vidishac2004 Jul 24, 2025
a0eee80
replaced match with simple if/else statements and used the let else l…
vidishac2004 Jul 24, 2025
7ce6f0c
Normalize line endings to LF and add .gitattributes
vidishac2004 Jul 24, 2025
f88b6dd
Normalize line endings to LF
vidishac2004 Jul 24, 2025
b4be668
resolved build error
vidishac2004 Jul 25, 2025
c024126
Update .env.oft-latest
vidishac2004 Jul 26, 2025
aa2e4ab
Update src/lib.rs
vidishac2004 Jul 26, 2025
570bb2c
resolved formatting issues
vidishac2004 Jul 26, 2025
3bebd0e
OFT branch merged with main
vidishac2004 Jul 26, 2025
5cb7657
Merge branch 'main' into open_fast_trace
vidishac2004 Jul 26, 2025
544bf37
Merge branch 'open_fast_trace' of github.com:catappreciationhours2/up…
catappreciationhours2 Aug 27, 2025
552e6e0
updated spec yaml to mirror mqtt formatting
catappreciationhours2 Aug 27, 2025
668990b
modified gitignore to match main
catappreciationhours2 Aug 27, 2025
177d959
Merge branch 'main' into open_fast_trace
catappreciationhours2 Aug 27, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions .env.oft-latest
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Copyright (c) 2025 Contributors to the Eclipse Foundation
#
# See the NOTICE file(s) distributed with this work for additional
# information regarding copyright ownership.
#
# This program and the accompanying materials are made available under the
# terms of the Apache License Version 2.0 which is available at
# https://www.apache.org/licenses/LICENSE-2.0
#
# SPDX-License-Identifier: Apache-2.0

# shellcheck disable=SC2148,SC2034

# The file patterns that specify the relevant parts of the latest uProtocol Specification
# that this component is supposed to implement
UP_SPEC_FILE_PATTERNS="up-spec/basics/uattributes.adoc up-spec/up-l1/README.adoc up-spec/up-l1/iceoryx2.adoc"

# The file patterns that specify this component's resources which contain specification items
# that cover the requirements
COMPONENT_FILE_PATTERNS="*.adoc *.md *.rs .github examples src tests"

OFT_FILE_PATTERNS="$UP_SPEC_FILE_PATTERNS $COMPONENT_FILE_PATTERNS"
OFT_TAGS="_,TransportLayerImpl,TransportLayerImplPush"
88 changes: 88 additions & 0 deletions .github/workflows/spec_compatibility.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
# ********************************************************************************
# Copyright (c) 2024 Contributors to the Eclipse Foundation
#
# See the NOTICE file(s) distributed with this work for additional
# information regarding copyright ownership.
#
# This program and the accompanying materials are made available under the
# terms of the Apache License Version 2.0 which is available at
# https://www.apache.org/licenses/LICENSE-2.0
#
# SPDX-License-Identifier: Apache-2.0
# ********************************************************************************

# Verifies that this crate can be built using the uProtocol Core API from up-spec's main branch.
# Also performs requirements tracing using OpenFastTrace. The job fails if any of the two
# activities fail.

name: Latest uP Spec Compatibility

on:
schedule:
- cron: '0 4 * * *'
workflow_dispatch:

concurrency:
group: ${{ github.ref }}-${{ github.workflow }}
cancel-in-progress: true

env:
RUST_TOOLCHAIN: ${{ vars.RUST_TOOLCHAIN || 'stable' }}
RUSTFLAGS: -Dwarnings
CARGO_TERM_COLOR: always

jobs:
requirements-tracing:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
submodules: "recursive"
- name: Fast-Forward to HEAD revision of uProtocol Spec main branch
run: |
cd "${{ github.workspace }}/up-spec"
echo "Switching to up-spec/main branch ..."
git checkout main
echo "fast-forwarding to HEAD revision ..."
git pull
git status
cd "${{ github.workspace }}"

- name: "Determine OpenFastTrace file patterns from .env file"
uses: xom9ikk/dotenv@v2.3.0
with:
mode: "oft-latest"
load-mode: strict

# run OpenFastTrace first because the action will always succeed and produce
# a tracing report
- name: Run OpenFastTrace
id: run-oft
uses: eclipse-uprotocol/ci-cd/.github/actions/run-oft@main
with:
file-patterns: "${{ env.OFT_FILE_PATTERNS }}"
tags: "${{ env.OFT_TAGS_}}"

# now try to build and run the tests which may fail if incompatible changes
# have been introduced into the uProtocol Core API
- uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ env.RUST_TOOLCHAIN }}
- uses: Swatinem/rust-cache@v2
- uses: taiki-e/install-action@nextest
- name: Run tests
run: |
# Using nextest because it's faster than built-in test
cargo nextest run --all-features
# but it cannot execute doc tests
cargo test --doc --all-features

# This step will only be run if the tests in the previous step have succeeded.
# In that case, we use the exit code produced by the OFT run as the job's
# overall outcome. This means that the job fails if the tests run successfully
# but some of the requirements from up-spec are not covered.
- name: Determine exit status
env:
OFT_EXIT_CODE: ${{ steps.run-oft.outputs.oft-exit-code }}
run: |
exit $OFT_EXIT_CODE
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
#
# This program and the accompanying materials are made available under the
# terms of the Apache License Version 2.0 which is available at
# https: //www.apache.org/licenses/LICENSE-2.0
# https://www.apache.org/licenses/LICENSE-2.0
#
# SPDX-License-Identifier: Apache-2.0
# ################################################################################
Expand Down
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[submodule "up-spec"]
path = up-spec
url = https://github.com/eclipse-uprotocol/up-spec
53 changes: 19 additions & 34 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ impl Iceoryx2Transport {
/// send() makes use of UAttributesValidator
/// register_listener() and unregister_listener() use verify_filter_criteria()
/// Criteria for identification of message types can be found here: https://github.com/eclipse-uprotocol/up-spec/blob/main/basics/uattributes.adoc

fn determine_message_type(source: &UUri, sink: Option<&UUri>) -> Result<MessageType, UStatus> {
let src_id = source.resource_id;
let sink_id = sink.map(|s| s.resource_id);
Expand All @@ -95,6 +96,7 @@ impl Iceoryx2Transport {
}

/// Called in send(), register_listener() and unregister_listener()

fn compute_service_name(source: &UUri, sink: Option<&UUri>) -> Result<String, UStatus> {
let join_segments = |segments: Vec<String>| segments.join("/");

Expand Down Expand Up @@ -141,52 +143,49 @@ mod tests {
UUri::try_from_parts(authority, entity_id, version, resource).unwrap()
}

// performing successful tests for service name computation

#[test]
// [specitem,oft-sid="dsn~up-transport-iceoryx2-service-name~1",oft-needs="utest"]
// [utest->dsn~up-transport-iceoryx2-service-name~1]
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this correctly marks this test as implementing the required test for the dsn~up-transport-iceoryx2-service-name~1 specitem. However, you will also need to add a corresponding marker to code/function that actually implements the specitem using [impl->dsn~up-transport-iceoryx2-service-name~1] ...

fn test_publish_service_name() {
let source = test_uri("device1", 0x0000, 0x10AB, 0x03, 0x7FFF);

let name = Iceoryx2Transport::compute_service_name(&source, None).unwrap();
let name = Iceoryx2Transport::compute_service_name(&source,None).unwrap();
assert_eq!(name, "up/device1/10AB/0/3/7FFF");
}

#[test]
// [specitem,oft-sid="dsn~up-transport-iceoryx2-service-name~1",oft-needs="utest"]

// [utest->dsn~up-transport-iceoryx2-service-name~1]
fn test_notification_service_name() {
let source = test_uri("device1", 0x0000, 0x10AB, 0x03, 0x80CD);
let sink = test_uri("device1", 0x0000, 0x30EF, 0x04, 0x0000);
let name = Iceoryx2Transport::compute_service_name(&source, Some(&sink)).unwrap();
let name = Iceoryx2Transport::compute_service_name(&source,Some(&sink)).unwrap();

assert_eq!(name, "up/device1/10AB/0/3/80CD/device1/30EF/0/4/0");
}

#[test]
// [specitem,oft-sid="dsn~up-transport-iceoryx2-service-name~1",oft-needs="utest"]

// [utest->dsn~up-transport-iceoryx2-service-name~1]
fn test_rpc_request_service_name() {
let sink = test_uri("device1", 0x0004, 0x03AB, 0x03, 0x0000);
let reply_to = test_uri("device1", 0x0000, 0x00CD, 0x04, 0xB);

let name = Iceoryx2Transport::compute_service_name(&sink, Some(&reply_to)).unwrap();

assert_eq!(name, "up/device1/CD/0/4/B");
}

#[test]
// [specitem,oft-sid="dsn~up-transport-iceoryx2-service-name~1",oft-needs="utest"]
// [utest->dsn~up-transport-iceoryx2-service-name~1]
fn test_rpc_response_service_name() {
let source = test_uri("device1", 0x0000, 0x00CD, 0x04, 0xB);
let sink = test_uri("device1", 0x0004, 0x3AB, 0x3, 0x0000);

let name = Iceoryx2Transport::compute_service_name(&source, Some(&sink)).unwrap();
let name = Iceoryx2Transport::compute_service_name(&source,Some(&sink)).unwrap();

assert_eq!(name, "up/device1/CD/0/4/B/device1/3AB/4/3/0");
}

// performing failing tests for service name computation

#[test]
// .specitem[dsn~up-attributes-request-source~1]
// .specitem[dsn~up-attributes-response-source~1]
// .specitem[dsn~up-attributes-notification-source~1]
// [utest->dsn~up-transport-iceoryx2-service-name~1]
fn test_missing_uri_error() {
let uuri = UUri::new();
let result = Iceoryx2Transport::compute_service_name(&uuri, None);
Expand All @@ -196,11 +195,8 @@ mod tests {
}

#[test]
//both source and sink have resource ID equal to 0
// .specitem[dsn~up-attributes-request-source~1]
// .specitem[dsn~up-attributes-request-sink~1]
// .specitem[dsn~up-attributes-response-source~1]
// .specitem[dsn~up-attributes-response-sink~1]
// [utest->dsn~up-transport-iceoryx2-service-name~1]

fn test_fail_resource_id_error() {
let source = test_uri("device1", 0x0000, 0x00CD, 0x04, 0x000);
let sink = test_uri("device1", 0x0004, 0x3AB, 0x3, 0x0000);
Expand All @@ -209,24 +205,13 @@ mod tests {
}

#[test]
//source has resource id=0 but missing sink
// .specitem[dsn~up-attributes-request-sink~1]
// .specitem[dsn~up-attributes-request-source~1]
fn test_fail_missing_sink_error() {
let source = test_uri("device1", 0x0000, 0x00CD, 0x04, 0x000);
let result = Iceoryx2Transport::compute_service_name(&source, None);
assert!(result.is_err_and(|err| err.get_code() == UCode::INVALID_ARGUMENT));
}
// [utest->dsn~up-transport-iceoryx2-service-name~1]

#[test]
//missing source URI
// .specitem[dsn~up-attributes-request-source~1]
// .specitem[dsn~up-attributes-response-source~1]
// .specitem[dsn~up-attributes-notification-source~1]
fn test_fail_missing_source_error() {
let uuri = UUri::new();
let sink = test_uri("device1", 0x0004, 0x3AB, 0x3, 0x000);
let result = Iceoryx2Transport::compute_service_name(&uuri, Some(&sink));
assert!(result.is_err_and(|err| err.get_code() == UCode::INVALID_ARGUMENT));
}
}

1 change: 1 addition & 0 deletions up-spec
Submodule up-spec added at ba0f3c