Skip to content
Merged
Show file tree
Hide file tree
Changes from 25 commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
294f654
CI: re-enable Managed DevOps Pool by default in azure-pipelines.yml
marcschier Jul 8, 2026
32e83a2
Merge branch 'master' into ci/enable-managed-pool
marcschier Jul 9, 2026
201e9e5
Merge branch 'master' into ci/enable-managed-pool
marcschier Jul 9, 2026
cb02daa
Merge remote-tracking branch 'origin/master' into ci/enable-managed-pool
marcschier Jul 13, 2026
b374f1b
test: cover Quickstarts server utility registration
marcschier Jul 12, 2026
5faf4d9
test: cover ISA95 JobControl NodeSet2 generation
marcschier Jul 12, 2026
988d7d4
Dispose canceled managed session creation
marcschier Jul 12, 2026
aa4e9a1
test: use complete ISA95 JobControl fixture
marcschier Jul 13, 2026
869fbab
test: cover canceled managed session creation
marcschier Jul 13, 2026
066260a
test: exclude uninjectable secondary cleanup guard
marcschier Jul 13, 2026
eccfefc
Merge remote-tracking branch 'origin/master' into ci/enable-managed-pool
marcschier Jul 14, 2026
1378be0
Merge remote-tracking branch 'origin/master' into ci/enable-managed-pool
marcschier Jul 15, 2026
e7bf052
Merge remote-tracking branch 'origin/master' into ci/enable-managed-pool
marcschier Jul 15, 2026
e40d66d
Merge remote-tracking branch 'origin/master' into copilot/publisher3-…
marcschier Jul 15, 2026
1b08ee6
Merge remote-tracking branch 'origin/master' into ci/enable-managed-pool
marcschier Jul 16, 2026
d56119e
Address review feedback for regression tests
marcschier Jul 16, 2026
ece0345
Merge remote-tracking branch 'origin/ci/enable-managed-pool' into ci/…
marcschier Jul 16, 2026
02ee5a8
Merge remote-tracking branch 'origin/master' into ci/enable-managed-pool
marcschier Jul 16, 2026
ff8e9a9
Merge remote-tracking branch 'origin/master' into copilot/publisher3-…
marcschier Jul 16, 2026
d05536d
Add ISA95 JobControl and ManagedSession regression coverage (#3998)
marcschier Jul 17, 2026
d61bb51
CI: share managed pool and hosted agents across the pipeline
marcschier Jul 17, 2026
55bdb5b
CI: re-enable Managed DevOps Pool by default (#3969)
marcschier Jul 17, 2026
3c4b434
Fail fast on reverse connect listener startup (#4009)
marcschier Jul 17, 2026
02b38dd
Merge remote-tracking branch 'upstream/master'
koepalex Jul 19, 2026
2b3838b
browse completness fix
koepalex Jul 19, 2026
7c29001
addressed review feedback
koepalex Jul 20, 2026
7b4d9be
Merge branch 'master' into koepalex/browse-bug
koepalex Jul 20, 2026
4ad5fbe
set dotnet env variables to allow use of empherial containers
koepalex Jul 20, 2026
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
18 changes: 15 additions & 3 deletions src/Opc.Ua.Server/NodeManager/MasterNodeManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1897,7 +1897,11 @@ await GetManagerHandleAsync(view.ViewId, cancellationToken)
BrowseDescription nodeToBrowse = nodesToBrowse[ii];

// initialize result.
var result = new BrowseResult { StatusCode = StatusCodes.Good };
var result = new BrowseResult
{
StatusCode = StatusCodes.Good,
ContinuationPoint = default
};
results.Add(result);

ServiceResult error;
Expand Down Expand Up @@ -2065,7 +2069,11 @@ private static void PrepareValidationCache<T>(
.ConfigureAwait(false);
if (ServiceResult.IsBad(validationResult))
{
var badResult = new BrowseResult { StatusCode = validationResult.Code };
var badResult = new BrowseResult
{
StatusCode = validationResult.Code,
ContinuationPoint = default
};
results.Add(badResult);

// put placeholder for diagnostics
Expand All @@ -2075,7 +2083,11 @@ private static void PrepareValidationCache<T>(
}

// initialize result.
var result = new BrowseResult { StatusCode = StatusCodes.Good };
var result = new BrowseResult
{
StatusCode = StatusCodes.Good,
ContinuationPoint = default
};
results.Add(result);

// check if simply releasing the continuation point.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,8 +118,8 @@ public async Task BrowseNextUntilDoneCollectsAllReferencesAsync()
cp = nextResp.Results[0].ContinuationPoint;
}

Assert.That(cp.IsEmpty, Is.True,
"Continuation point should be empty after full traversal.");
Assert.That(cp.IsNull, Is.True,
"Continuation point should be null after full traversal.");
Assert.That(totalRefs, Is.GreaterThan(1),
"Server node should have more than one reference.");
}
Expand Down Expand Up @@ -391,7 +391,7 @@ public async Task BrowseNodeWithFewReferencesNoContinuationNeededAsync()
Assert.That(response.Results.Count, Is.EqualTo(1));
Assert.That(
StatusCode.IsGood(response.Results[0].StatusCode), Is.True);
Assert.That(response.Results[0].ContinuationPoint.IsEmpty, Is.True,
Assert.That(response.Results[0].ContinuationPoint.IsNull, Is.True,
"Views folder has few children; no continuation point " +
"should be returned with MaxRefs=100.");
}
Expand Down Expand Up @@ -432,7 +432,7 @@ public async Task BrowseNextWithReleaseTrueReturnsNoReferencesAsync()
Is.True,
"Release should return Good status.");
Assert.That(
releaseResp.Results[0].ContinuationPoint.IsEmpty, Is.True,
releaseResp.Results[0].ContinuationPoint.IsNull, Is.True,
"No continuation point should remain after release.");
}

Expand Down Expand Up @@ -631,7 +631,7 @@ public async Task BrowseWithMaxRefsZeroReturnsAllAsync()
Assert.That(response.Results[0].References.Count,
Is.GreaterThan(0),
"Server node should have at least one reference.");
Assert.That(response.Results[0].ContinuationPoint.IsEmpty, Is.True,
Assert.That(response.Results[0].ContinuationPoint.IsNull, Is.True,
"MaxReferencesPerNode=0 should return all references " +
"without a continuation point.");
}
Expand Down
2 changes: 1 addition & 1 deletion tests/Opc.Ua.InformationModel.Tests/BrowseTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -417,7 +417,7 @@ public async Task Browse010BrowseNextReleaseContinuationPointAsync()
Assert.That(releaseResponse.Results.Count, Is.EqualTo(1));
Assert.That(StatusCode.IsGood(releaseResponse.Results[0].StatusCode), Is.True,
"Releasing a continuation point should return Good.");
Assert.That(releaseResponse.Results[0].ContinuationPoint.IsEmpty, Is.True,
Assert.That(releaseResponse.Results[0].ContinuationPoint.IsNull, Is.True,
"No continuation point should remain after release.");
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,34 @@ public async Task BrowseAsync_UnknownNode_ReturnsBadNodeIdUnknownAsync()

Assert.That(results.Count, Is.EqualTo(1));
Assert.That(results[0].StatusCode, Is.EqualTo(StatusCodes.BadNodeIdUnknown));
Assert.That(results[0].ContinuationPoint.IsNull, Is.True);
}

[Test]
public async Task BrowseAsyncCompletedResultUsesNullContinuationPointAsync()
Comment thread
koepalex marked this conversation as resolved.
Outdated
{
IMasterNodeManager sut = m_server.CurrentInstance.NodeManager;
OperationContext ctx = CreateContext();

var nodeToBrowse = new BrowseDescription
{
NodeId = ObjectIds.ViewsFolder,
BrowseDirection = BrowseDirection.Forward,
ReferenceTypeId = ReferenceTypeIds.HierarchicalReferences,
IncludeSubtypes = true,
ResultMask = (uint)BrowseResultMask.All
};

(ArrayOf<BrowseResult> results, _) = await sut.BrowseAsync(
ctx,
new ViewDescription(),
100u,
new BrowseDescription[] { nodeToBrowse }.ToArrayOf(),
CancellationToken.None).ConfigureAwait(false);
Comment thread
koepalex marked this conversation as resolved.

Assert.That(results.Count, Is.EqualTo(1));
Assert.That(results[0].StatusCode, Is.EqualTo(StatusCodes.Good));
Assert.That(results[0].ContinuationPoint.IsNull, Is.True);
}

[Test]
Expand Down Expand Up @@ -296,6 +324,7 @@ public async Task BrowseNextAsync_InvalidContinuationPoint_ReturnsBadContinuatio

Assert.That(results.Count, Is.EqualTo(1));
Assert.That(results[0].StatusCode, Is.EqualTo(StatusCodes.BadContinuationPointInvalid));
Assert.That(results[0].ContinuationPoint.IsNull, Is.True);
}

[Test]
Expand All @@ -317,6 +346,7 @@ public async Task BrowseNextAsync_ReleaseInvalidContinuationPoint_ReturnsGoodAsy

Assert.That(results.Count, Is.EqualTo(1));
Assert.That(results[0].StatusCode, Is.EqualTo(StatusCodes.Good));
Assert.That(results[0].ContinuationPoint.IsNull, Is.True);
}

[Test]
Expand Down
Loading