Skip to content

Commit 1da63e4

Browse files
authored
Merge pull request #245 from ali-ince/1.5-fix-packstream-struct-leakage
Fixed internal class leakage
2 parents 0afc97a + af01abf commit 1da63e4

21 files changed

+631
-535
lines changed

Neo4j.Driver/Neo4j.Driver.Tests/IO/BoltReaderTests.cs

Lines changed: 76 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
// See the License for the specific language governing permissions and
1616
// limitations under the License.
1717
using System;
18+
using System.Collections;
1819
using System.Collections.Generic;
1920
using System.IO;
2021
using System.Linq;
@@ -195,6 +196,70 @@ public void ShouldReadRecordMessageReturningPath()
195196
}
196197

197198

199+
//00 79 B1 71 92 B3 4E 02 91 86 50 65 72 73 6F 6E A1 84 6E 61 6D 65 81 63 92 A2 83 72 65 6C B5 52 03 02 05 84 4F 57 4E 53 A0 87 70 72 6F 64 75 63 74 B3 4E 05 91 87 50 72 6F 64 75 63 74 A1 84 6E 61 6D 65 84 69 70 6F 64 A2 83 72 65 6C B5 52 02 02 03 84 4F 57 4E 53 A0 87 70 72 6F 64 75 63 74 B3 4E 03 91 87 50 72 6F 64 75 63 74 A1 84 6E 61 6D 65 88 63 6F 6D 70 75 74 65 72
200+
//[RECORD [Neo4j.Driver.Internal.Node, [[{rel : Neo4j.Driver.Internal.Relationship}, {product : Neo4j.Driver.Internal.Node}], [{rel : Neo4j.Driver.Internal.Relationship}, {product : Neo4j.Driver.Internal.Node}]]]]
201+
[Fact]
202+
public void ShouldReadRecordMessageWithInnerStructs()
203+
{
204+
var fields = new object[0];
205+
var mockInput =
206+
IOExtensions.CreateMockStream(
207+
"00 79 B1 71 92 B3 4E 02 91 86 50 65 72 73 6F 6E A1 84 6E 61 6D 65 81 63 92 A2 83 72 65 6C B5 52 03 02 05 84 4F 57 4E 53 A0 87 70 72 6F 64 75 63 74 B3 4E 05 91 87 50 72 6F 64 75 63 74 A1 84 6E 61 6D 65 84 69 70 6F 64 A2 83 72 65 6C B5 52 02 02 03 84 4F 57 4E 53 A0 87 70 72 6F 64 75 63 74 B3 4E 03 91 87 50 72 6F 64 75 63 74 A1 84 6E 61 6D 65 88 63 6F 6D 70 75 74 65 72 00 00");
208+
var mockResponseHandler = new Mock<IMessageResponseHandler>();
209+
mockResponseHandler.Setup(x => x.HandleRecordMessage(It.IsAny<object[]>()))
210+
.Callback<object[]>(x => fields = x);
211+
var reader = new BoltReader(mockInput.Object);
212+
213+
reader.Read(mockResponseHandler.Object);
214+
215+
mockResponseHandler.Verify(x => x.HandleRecordMessage(It.IsAny<object[]>()), Times.Once);
216+
217+
fields.Should().NotBeNull();
218+
fields.Should().HaveCount(2);
219+
220+
fields[0].Should().BeAssignableTo<INode>();
221+
fields[0].ValueAs<INode>().Labels.Should().Contain("Person");
222+
fields[0].ValueAs<INode>().Properties.Keys.Should().Contain("name");
223+
fields[0].ValueAs<INode>().Properties.Values.Should().Contain("c");
224+
225+
fields[1].Should().BeAssignableTo<IList>();
226+
227+
var el0 = ((IList) fields[1])[0];
228+
el0.Should().BeAssignableTo<IDictionary<string, object>>();
229+
el0.ValueAs<IDictionary<string, object>>().Should().ContainKey("rel");
230+
var rel0 = el0.ValueAs<IDictionary<string, object>>()["rel"];
231+
rel0.Should().BeAssignableTo<IRelationship>();
232+
rel0.ValueAs<IRelationship>().Type.Should().Be("OWNS");
233+
rel0.ValueAs<IRelationship>().StartNodeId.Should().Be(2L);
234+
rel0.ValueAs<IRelationship>().EndNodeId.Should().Be(5L);
235+
rel0.ValueAs<IRelationship>().Properties.Should().BeEmpty();
236+
237+
el0.ValueAs<IDictionary<string, object>>().Should().ContainKey("product");
238+
var prod0 = el0.ValueAs<IDictionary<string, object>>()["product"];
239+
prod0.Should().BeAssignableTo<INode>();
240+
prod0.ValueAs<INode>().Labels.Should().Contain("Product");
241+
prod0.ValueAs<INode>().Properties.Keys.Should().Contain("name");
242+
prod0.ValueAs<INode>().Properties.Values.Should().Contain("ipod");
243+
244+
var el1 = ((IList)fields[1])[1];
245+
el1.Should().BeAssignableTo<IDictionary<string, object>>();
246+
el1.ValueAs<IDictionary<string, object>>().Should().ContainKey("rel");
247+
var rel1 = el1.ValueAs<IDictionary<string, object>>()["rel"];
248+
rel1.Should().BeAssignableTo<IRelationship>();
249+
rel1.ValueAs<IRelationship>().Type.Should().Be("OWNS");
250+
rel1.ValueAs<IRelationship>().StartNodeId.Should().Be(2L);
251+
rel1.ValueAs<IRelationship>().EndNodeId.Should().Be(3L);
252+
rel1.ValueAs<IRelationship>().Properties.Should().BeEmpty();
253+
254+
el1.ValueAs<IDictionary<string, object>>().Should().ContainKey("product");
255+
var prod1 = el1.ValueAs<IDictionary<string, object>>()["product"];
256+
prod1.Should().BeAssignableTo<INode>();
257+
prod1.ValueAs<INode>().Labels.Should().Contain("Product");
258+
prod1.ValueAs<INode>().Properties.Keys.Should().Contain("name");
259+
prod1.ValueAs<INode>().Properties.Values.Should().Contain("computer");
260+
}
261+
262+
198263
[Fact]
199264
public void ShouldReadRecordMessageReturningNumberNodeRelationShipPath()
200265
{
@@ -560,9 +625,9 @@ private static object ReadFromByteArrayChunked(byte[] bytes)
560625
[Fact]
561626
public void ShouldThrowExceptionWhenStructSignatureNotRecognized()
562627
{
563-
var structure = new PackStreamStruct((byte)'C', Enumerable.Empty<object>());
628+
var bytes = "00 07 B5 43 01 02 03 80 a0 00 00".ToByteArray();
564629

565-
var ex = Record.Exception(() => BoltReader.UnpackStructure(structure));
630+
var ex = Record.Exception(() => ReadFromByteArrayChunked(bytes));
566631

567632
ex.Should().NotBeNull();
568633
ex.Should().BeOfType<ProtocolException>();
@@ -573,10 +638,7 @@ public void ShouldUnpackRelationshipCorrectly()
573638
{
574639
var bytes = "00 07 B5 52 01 02 03 80 a0 00 00".ToByteArray();
575640

576-
var structure = ReadFromByteArrayChunked(bytes) as PackStreamStruct;
577-
structure.Should().NotBeNull();
578-
579-
var rel = BoltReader.UnpackStructure(structure) as IRelationship;
641+
var rel = ReadFromByteArrayChunked(bytes) as IRelationship;
580642
rel.Should().NotBeNull();
581643

582644
rel.Id.Should().Be(1);
@@ -591,10 +653,7 @@ public void ShouldUnpackNodeCorrectly()
591653
{
592654
var bytes = "00 06 B3 4E 01 90 A0 00 00 00".ToByteArray();
593655

594-
var structure = ReadFromByteArrayChunked(bytes) as PackStreamStruct;
595-
structure.Should().NotBeNull();
596-
597-
var n = BoltReader.UnpackStructure(structure) as INode;
656+
var n = ReadFromByteArrayChunked(bytes) as INode;
598657
n.Should().NotBeNull();
599658

600659
n.Id.Should().Be(1);
@@ -607,10 +666,7 @@ public void ShouldUnpackPathCorrectly()
607666
{
608667
var bytes = "00 0A B3 50 91 B3 4E 01 90 A0 90 90 00 00".ToByteArray();
609668

610-
var structure = ReadFromByteArrayChunked(bytes) as PackStreamStruct;
611-
structure.Should().NotBeNull();
612-
613-
var p = BoltReader.UnpackStructure(structure) as IPath;
669+
var p = ReadFromByteArrayChunked(bytes) as IPath;
614670
p.Should().NotBeNull();
615671

616672
p.Start.Should().NotBeNull();
@@ -630,10 +686,7 @@ public void ShouldUnpackZeroLenghPathCorrectly()
630686
"00 2C B3 50 91 B3 4E C9 03 E9 92 86 50 65 72 73 6F 6E 88 45 6D 70 6C 6F 79 65 65 A2 84 6E 61 6D 65 85 41 6C 69 63 65 83 61 67 65 21 90 90 00 00"
631687
.ToByteArray();
632688

633-
var structure = ReadFromByteArrayChunked(bytes) as PackStreamStruct;
634-
structure.Should().NotBeNull();
635-
636-
var p = BoltReader.UnpackStructure(structure) as IPath;
689+
var p = ReadFromByteArrayChunked(bytes) as IPath;
637690
p.Should().NotBeNull();
638691

639692
p.Start.Should().NotBeNull();
@@ -652,10 +705,7 @@ public void ShouldUnpackPathWithLenghOneCorrectly()
652705
"00 66 B3 50 92 B3 4E C9 03 E9 92 86 50 65 72 73 6F 6E 88 45 6D 70 6C 6F 79 65 65 A2 84 6E 61 6D 65 85 41 6C 69 63 65 83 61 67 65 21 B3 4E C9 03 EA 92 86 50 65 72 73 6F 6E 88 45 6D 70 6C 6F 79 65 65 A2 84 6E 61 6D 65 83 42 6F 62 83 61 67 65 2C 91 B3 72 0C 85 4B 4E 4F 57 53 A1 85 73 69 6E 63 65 C9 07 CF 92 01 01 00 00"
653706
.ToByteArray();
654707

655-
var structure = ReadFromByteArrayChunked(bytes) as PackStreamStruct;
656-
structure.Should().NotBeNull();
657-
658-
var p = BoltReader.UnpackStructure(structure) as IPath;
708+
var p = ReadFromByteArrayChunked(bytes) as IPath;
659709
p.Should().NotBeNull();
660710

661711
p.Nodes.Should().HaveCount(2);
@@ -675,10 +725,7 @@ public void ShouldUnpackPathWithRelationshipTraversedAgainstItsDirectionCorrectl
675725
"00 b0 B35094B34EC903E99286506572736F6E88456D706C6F796565A2846E616D6585416C6963658361676521B34EC903EA9286506572736F6E88456D706C6F796565A2846E616D6583426F62836167652CB34EC903EB9186506572736F6EA1846E616D65854361726F6CB34EC903EC90A1846E616D65844461766593B3720C854B4E4F5753A18573696E6365C907CFB37220884449534C494B4553A0B372228A4D4152524945445F544FA0960101FE020303 00 00"
676726
.ToByteArray();
677727

678-
var structure = ReadFromByteArrayChunked(bytes) as PackStreamStruct;
679-
structure.Should().NotBeNull();
680-
681-
var p = BoltReader.UnpackStructure(structure) as IPath;
728+
var p = ReadFromByteArrayChunked(bytes) as IPath;
682729
p.Should().NotBeNull();
683730

684731
p.Nodes.Should().HaveCount(4);
@@ -715,10 +762,7 @@ public void ShouldUnpackPathWithNodeVisitedMulTimesCorrectly()
715762
"00 9E B35093B34EC903E99286506572736F6E88456D706C6F796565A2846E616D6585416C6963658361676521B34EC903EA9286506572736F6E88456D706C6F796565A2846E616D6583426F62836167652CB34EC903EB9186506572736F6EA1846E616D65854361726F6C93B3720C854B4E4F5753A18573696E6365C907CFB3720D854C494B4553A0B37220884449534C494B4553A09A0101FF0002020301FD02 00 00"
716763
.ToByteArray();
717764

718-
var structure = ReadFromByteArrayChunked(bytes) as PackStreamStruct;
719-
structure.Should().NotBeNull();
720-
721-
var p = BoltReader.UnpackStructure(structure) as IPath;
765+
var p = ReadFromByteArrayChunked(bytes) as IPath;
722766
p.Should().NotBeNull();
723767

724768
p.Nodes.Should().HaveCount(6);
@@ -759,10 +803,7 @@ public void ShouldUnpackPathWithRelTraversedMulTimesInSameDirectionCorrectly()
759803
"00 BE B35094B34EC903E99286506572736F6E88456D706C6F796565A2846E616D6585416C6963658361676521B34EC903EB9186506572736F6EA1846E616D65854361726F6CB34EC903EA9286506572736F6E88456D706C6F796565A2846E616D6583426F62836167652CB34EC903EC90A1846E616D65844461766594B3720D854C494B4553A0B37220884449534C494B4553A0B3720C854B4E4F5753A18573696E6365C907CFB372228A4D4152524945445F544FA09A01010202FD0001010403 00 00"
760804
.ToByteArray();
761805

762-
var structure = ReadFromByteArrayChunked(bytes) as PackStreamStruct;
763-
structure.Should().NotBeNull();
764-
765-
var p = BoltReader.UnpackStructure(structure) as IPath;
806+
var p = ReadFromByteArrayChunked(bytes) as IPath;
766807
p.Should().NotBeNull();
767808

768809
p.Nodes.Should().HaveCount(6);
@@ -803,10 +844,7 @@ public void ShouldUnpackPathWithLoopCorrectly()
803844
"00 50 B35092B34EC903EB9186506572736F6EA1846E616D65854361726F6CB34EC903EC90A1846E616D65844461766592B372228A4D4152524945445F544FA0B3722C89574F524B535F464F52A09401010201 00 00"
804845
.ToByteArray();
805846

806-
var structure = ReadFromByteArrayChunked(bytes) as PackStreamStruct;
807-
structure.Should().NotBeNull();
808-
809-
var p = BoltReader.UnpackStructure(structure) as IPath;
847+
var p = ReadFromByteArrayChunked(bytes) as IPath;
810848
p.Should().NotBeNull();
811849

812850
p.Nodes.Should().HaveCount(3);

Neo4j.Driver/Neo4j.Driver.Tests/IO/PackStreamReaderBytesIncompatibleTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public void ShouldThrowWhenBytesIsSent()
3535
{
3636
var mockInput =
3737
IOExtensions.CreateMockStream("CC 01 01".ToByteArray());
38-
var reader = new PackStreamReaderBytesIncompatible(mockInput.Object);
38+
var reader = new PackStreamReaderBytesIncompatible(mockInput.Object, BoltReader.StructHandlers);
3939

4040
var ex = Record.Exception(() => reader.Read());
4141

0 commit comments

Comments
 (0)