Skip to content

Commit 53fd615

Browse files
committed
test: improve Go and FFI coverage
Signed-off-by: Will Killian <wkillian@nvidia.com>
1 parent d5c2407 commit 53fd615

8 files changed

Lines changed: 1061 additions & 6 deletions

File tree

crates/ffi/tests/integration/api/coverage_sweeps_tests.rs

Lines changed: 429 additions & 0 deletions
Large diffs are not rendered by default.

crates/ffi/tests/unit/api/coverage_sweeps_tests.rs

Lines changed: 480 additions & 0 deletions
Large diffs are not rendered by default.

crates/ffi/tests/unit/types_tests.rs

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,12 @@ fn test_llm_request_null_inputs_event_null_guards_and_free_nulls() {
245245
assert!(unsafe { nemo_relay_event_tool_call_id(std::ptr::null()) }.is_null());
246246
assert!(unsafe { nemo_relay_event_parent_uuid(std::ptr::null()) }.is_null());
247247
assert!(unsafe { nemo_relay_event_scope_type(std::ptr::null()) }.is_null());
248+
assert!(unsafe { nemo_relay_event_atof_version(std::ptr::null()) }.is_null());
249+
assert!(unsafe { nemo_relay_event_scope_category(std::ptr::null()) }.is_null());
250+
assert!(unsafe { nemo_relay_event_category(std::ptr::null()) }.is_null());
251+
assert!(unsafe { nemo_relay_event_attributes_json(std::ptr::null()) }.is_null());
252+
assert!(unsafe { nemo_relay_event_category_profile(std::ptr::null()) }.is_null());
253+
assert!(unsafe { nemo_relay_event_data_schema(std::ptr::null()) }.is_null());
248254

249255
unsafe {
250256
nemo_relay_scope_handle_free(std::ptr::null_mut());
@@ -256,6 +262,7 @@ fn test_llm_request_null_inputs_event_null_guards_and_free_nulls() {
256262
nemo_relay_atif_exporter_free(std::ptr::null_mut());
257263
nemo_relay_otel_subscriber_free(std::ptr::null_mut());
258264
nemo_relay_openinference_subscriber_free(std::ptr::null_mut());
265+
nemo_relay_adaptive_runtime_free(std::ptr::null_mut());
259266
}
260267
}
261268

@@ -329,6 +336,9 @@ fn test_valid_free_functions_and_none_backed_accessors() {
329336
),
330337
)));
331338
unsafe { nemo_relay_atif_exporter_free(exporter_ptr) };
339+
340+
let adaptive_ptr = Box::into_raw(Box::new(FfiAdaptiveRuntime(std::sync::Mutex::new(None))));
341+
unsafe { nemo_relay_adaptive_runtime_free(adaptive_ptr) };
332342
}
333343

334344
#[test]
@@ -386,10 +396,26 @@ fn test_llm_request_and_event_accessors() {
386396
take_string(unsafe { nemo_relay_event_scope_category(&ffi_event) }),
387397
Some("start".into())
388398
);
399+
assert_eq!(
400+
take_string(unsafe { nemo_relay_event_atof_version(&ffi_event) }),
401+
Some("0.1".into())
402+
);
389403
assert_eq!(
390404
take_string(unsafe { nemo_relay_event_category(&ffi_event) }),
391405
Some("guardrail".into())
392406
);
407+
assert_eq!(
408+
take_string(unsafe { nemo_relay_event_attributes_json(&ffi_event) }),
409+
Some("[]".into())
410+
);
411+
assert_eq!(
412+
take_string(unsafe { nemo_relay_event_category_profile(&ffi_event) }),
413+
None
414+
);
415+
assert_eq!(
416+
take_string(unsafe { nemo_relay_event_data_schema(&ffi_event) }),
417+
None
418+
);
393419
assert_eq!(
394420
take_string(unsafe { nemo_relay_event_uuid(&ffi_event) }),
395421
Some(scope_event.uuid().to_string())
@@ -464,6 +490,10 @@ fn test_llm_request_and_event_accessors() {
464490
take_string(unsafe { nemo_relay_event_model_name(&ffi_llm_event) }),
465491
Some("model".into())
466492
);
493+
let llm_profile = take_string(unsafe { nemo_relay_event_category_profile(&ffi_llm_event) })
494+
.expect("expected category profile");
495+
let llm_profile: serde_json::Value = serde_json::from_str(&llm_profile).unwrap();
496+
assert_eq!(llm_profile["model_name"], json!("model"));
467497
assert_eq!(
468498
take_string(unsafe { nemo_relay_event_scope_type(&ffi_llm_event) }),
469499
Some("llm".into())
@@ -507,6 +537,22 @@ fn test_llm_request_and_event_accessors() {
507537
take_string(unsafe { nemo_relay_event_scope_type(&ffi_mark_event) }),
508538
None
509539
);
540+
assert_eq!(
541+
take_string(unsafe { nemo_relay_event_atof_version(&ffi_mark_event) }),
542+
Some("0.1".into())
543+
);
544+
assert_eq!(
545+
take_string(unsafe { nemo_relay_event_scope_category(&ffi_mark_event) }),
546+
None
547+
);
548+
assert_eq!(
549+
take_string(unsafe { nemo_relay_event_category(&ffi_mark_event) }),
550+
None
551+
);
552+
assert_eq!(
553+
take_string(unsafe { nemo_relay_event_attributes_json(&ffi_mark_event) }),
554+
None
555+
);
510556
assert_eq!(unsafe { nemo_relay_event_attributes(&ffi_mark_event) }, 0);
511557
}
512558

go/nemo_relay/adaptive/optimizer_test.go

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@
44
package adaptive
55

66
import (
7-
nemo_relay "github.com/NVIDIA/NeMo-Relay/go/nemo_relay"
87
"testing"
8+
9+
nemo_relay "github.com/NVIDIA/NeMo-Relay/go/nemo_relay"
910
)
1011

1112
func TestConfigBuilders(t *testing.T) {
@@ -77,3 +78,31 @@ func TestRedisBackendAndComponentSpecBuilders(t *testing.T) {
7778
t.Fatalf("expected wrapped config to preserve acg provider, got %#v", acgConfig["provider"])
7879
}
7980
}
81+
82+
func TestAdaptivePackageTelemetryAndLatencyHelpers(t *testing.T) {
83+
promptTokens := uint64(40)
84+
cacheReadTokens := uint64(10)
85+
event, err := BuildCacheTelemetryEvent(CacheTelemetryEventInput{
86+
Provider: "openai",
87+
RequestID: "00000000-0000-0000-0000-000000000501",
88+
Usage: &CacheUsage{
89+
PromptTokens: &promptTokens,
90+
CacheReadTokens: &cacheReadTokens,
91+
},
92+
AgentID: "go-adaptive-wrapper",
93+
TemplateVersion: "v1",
94+
ToolsetHash: "tools",
95+
ModelFamily: "gpt",
96+
TenantScope: "tenant",
97+
})
98+
if err != nil {
99+
t.Fatalf("BuildCacheTelemetryEvent failed: %v", err)
100+
}
101+
if event == nil || event.HitRate != 0.25 {
102+
t.Fatalf("unexpected cache telemetry event: %#v", event)
103+
}
104+
105+
if err := SetLatencySensitivity(0); err == nil {
106+
t.Fatal("expected SetLatencySensitivity to reject zero")
107+
}
108+
}

go/nemo_relay/adaptive_runtime_test.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,18 @@ func TestAdaptiveRuntimeBuildCacheRequestFacts(t *testing.T) {
149149
}
150150
}
151151

152+
func TestAdaptiveRuntimeBindScopeRejectsNilScope(t *testing.T) {
153+
runtime, err := NewAdaptiveRuntime(testAdaptiveRuntimeConfig("openai"))
154+
if err != nil {
155+
t.Fatalf("NewAdaptiveRuntime failed: %v", err)
156+
}
157+
defer runtime.Shutdown()
158+
159+
if err := runtime.BindScope(nil); err == nil {
160+
t.Fatal("expected BindScope to reject nil scope")
161+
}
162+
}
163+
152164
func TestSetLatencySensitivityRejectsInvalidValue(t *testing.T) {
153165
if SetLatencySensitivity(0) == nil {
154166
t.Fatal("expected SetLatencySensitivity(0) to fail")

go/nemo_relay/pii_redaction/pii_redaction_test.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,17 @@ func TestPiiRedactionShorthandHelpers(t *testing.T) {
2323
t.Fatalf("unexpected diagnostics: %#v", report.Diagnostics)
2424
}
2525
}
26+
27+
func TestPiiRedactionComponentSpecAndLocalModelHelpers(t *testing.T) {
28+
config := NewConfig()
29+
local := NewLocalModelConfig()
30+
local.Backend = "local"
31+
local.ModelID = "pii-model"
32+
config.Mode = "local"
33+
config.Local = &local
34+
35+
spec := NewComponentSpec(config)
36+
if !spec.Enabled || spec.Config.Local == nil || spec.Config.Local.ModelID != "pii-model" {
37+
t.Fatalf("unexpected PII redaction component spec: %#v", spec)
38+
}
39+
}

go/nemo_relay/pricing/pricing_test.go

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@
33

44
package pricing
55

6-
import "testing"
6+
import (
7+
"encoding/json"
8+
"testing"
9+
)
710

811
func TestPricingPackageHelpers(t *testing.T) {
912
entry := NewModelPricing("test", "priced-model")
@@ -29,3 +32,45 @@ func TestPricingPackageHelpers(t *testing.T) {
2932
t.Fatalf("expected clean report, got %#v", report.Diagnostics)
3033
}
3134
}
35+
36+
func TestPricingPackageSourceAndRateHelpers(t *testing.T) {
37+
fileSource := NewFileSource("/tmp/pricing.json")
38+
payload, err := json.Marshal(fileSource)
39+
if err != nil {
40+
t.Fatalf("marshal file source: %v", err)
41+
}
42+
var parsedSource map[string]any
43+
if err := json.Unmarshal(payload, &parsedSource); err != nil {
44+
t.Fatalf("unmarshal file source: %v", err)
45+
}
46+
if parsedSource["type"] != "file" || parsedSource["path"] != "/tmp/pricing.json" {
47+
t.Fatalf("unexpected file source: %#v", parsedSource)
48+
}
49+
50+
promptCache := NewPromptCacheConfig()
51+
if promptCache.ReadAccounting != CacheReadIncludedInPromptTokens {
52+
t.Fatalf("unexpected prompt cache defaults: %#v", promptCache)
53+
}
54+
55+
minTokens := uint64(256)
56+
tier := NewTokenRateTier(NewTokenRates(3, 4))
57+
tier.MinPromptTokens = &minTokens
58+
schedule := NewPromptTokenThresholdRateSchedule(tier)
59+
schedulePayload, err := json.Marshal(schedule)
60+
if err != nil {
61+
t.Fatalf("marshal rate schedule: %v", err)
62+
}
63+
var parsedSchedule map[string]any
64+
if err := json.Unmarshal(schedulePayload, &parsedSchedule); err != nil {
65+
t.Fatalf("unmarshal rate schedule: %v", err)
66+
}
67+
if parsedSchedule["type"] != "prompt_token_threshold" || parsedSchedule["applies_to"] != "full_request" {
68+
t.Fatalf("unexpected rate schedule: %#v", parsedSchedule)
69+
}
70+
71+
config := NewConfig()
72+
component := Component(config)
73+
if component.Kind != PluginKind || !component.Enabled {
74+
t.Fatalf("unexpected pricing component: %#v", component)
75+
}
76+
}

go/nemo_relay/subscribers/subscribers_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ func countScopedMarks(t *testing.T, handle *nemo_relay.ScopeHandle) int {
3636
if err := nemo_relay.EmitEvent("first-mark"); err != nil {
3737
t.Fatalf("EmitEvent failed: %v", err)
3838
}
39-
if err := nemo_relay.FlushSubscribers(); err != nil {
40-
t.Fatalf("FlushSubscribers failed: %v", err)
39+
if err := subscriberspkg.Flush(); err != nil {
40+
t.Fatalf("Flush failed: %v", err)
4141
}
4242
if err := subscriberspkg.ScopeDeregister(handle.UUID(), "subs_local"); err != nil {
4343
t.Fatalf("ScopeDeregister failed: %v", err)
@@ -75,8 +75,8 @@ func TestSubscriberShorthands(t *testing.T) {
7575
if err := subscriberspkg.Deregister("subs_global"); err != nil {
7676
t.Fatalf("Deregister failed: %v", err)
7777
}
78-
if err := nemo_relay.FlushSubscribers(); err != nil {
79-
t.Fatalf("FlushSubscribers failed: %v", err)
78+
if err := subscriberspkg.Flush(); err != nil {
79+
t.Fatalf("Flush failed: %v", err)
8080
}
8181

8282
mu.Lock()

0 commit comments

Comments
 (0)