-
Notifications
You must be signed in to change notification settings - Fork 332
Expand file tree
/
Copy pathPayloadProcessorTests.cs
More file actions
148 lines (125 loc) · 6.03 KB
/
Copy pathPayloadProcessorTests.cs
File metadata and controls
148 lines (125 loc) · 6.03 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System;
using System.IO;
using System.Linq;
using System.Net;
using Microsoft.Spark.Network;
using Microsoft.Spark.Sql;
using Microsoft.Spark.Utils;
using Microsoft.Spark.Worker.Processor;
using Xunit;
namespace Microsoft.Spark.Worker.UnitTest
{
[Collection("Spark Unit Tests")]
public class PayloadProcessorTests
{
[Theory]
[MemberData(nameof(TestData.VersionData), MemberType = typeof(TestData))]
public void TestPayloadProcessor(string version)
{
CommandPayload commandPayload = TestData.GetDefaultCommandPayload();
PayloadWriter payloadWriter = new PayloadWriterFactory().Create(new Version(version));
Payload payload = TestData.GetDefaultPayload();
Payload actualPayload = null;
using (var outStream = new MemoryStream())
{
payloadWriter.Write(outStream, payload, commandPayload);
using var inputStream = new MemoryStream(outStream.ToArray());
actualPayload = new PayloadProcessor(payloadWriter.Version).Process(inputStream);
}
// Validate the read payload.
Assert.Equal(payload.SplitIndex, actualPayload.SplitIndex);
Assert.Equal(payload.Version, actualPayload.Version);
Assert.Equal(payload.TaskContext, actualPayload.TaskContext);
Assert.Equal(payload.SparkFilesDir, actualPayload.SparkFilesDir);
Assert.Equal(payload.IncludeItems, actualPayload.IncludeItems);
Assert.Equal(payload.BroadcastVariables.Count, actualPayload.BroadcastVariables.Count);
ValidateCommandPayload(commandPayload, actualPayload.Command);
// Validate the UDFs.
var actualCommand1 = (SqlCommand)actualPayload.Command.Commands[0];
var result1 = ((PicklingWorkerFunction)actualCommand1.WorkerFunction).Func(
0,
new object[] { "hello", 10, 20 },
actualCommand1.ArgOffsets);
Assert.Equal("udf2 udf1 hello", result1);
var actualCommand2 = (SqlCommand)actualPayload.Command.Commands[1];
var result2 = ((PicklingWorkerFunction)actualCommand2.WorkerFunction).Func(
0,
new object[] { "hello", 10, 20 },
actualCommand2.ArgOffsets);
Assert.Equal(30, result2);
}
[Fact]
public void TestClosedStreamWithSocket()
{
var commandPayload = new CommandPayload()
{
EvalType = UdfUtils.PythonEvalType.SQL_BATCHED_UDF,
Commands = new Command[] { }
};
PayloadWriter payloadWriter = new PayloadWriterFactory().Create();
Payload payload = TestData.GetDefaultPayload();
using var serverListener = new DefaultSocketWrapper(IPAddress.Loopback);
serverListener.Listen();
var port = (serverListener.LocalEndPoint as IPEndPoint).Port;
using var clientSocket = new DefaultSocketWrapper(IPAddress.Loopback);
clientSocket.Connect(IPAddress.Loopback, port, null);
using (ISocketWrapper serverSocket = serverListener.Accept())
{
Stream outStream = serverSocket.OutputStream;
payloadWriter.Write(outStream, payload, commandPayload);
outStream.Flush();
}
// At this point server socket is closed.
Stream inStream = clientSocket.InputStream;
// Consume bytes already written to the socket.
var payloadProcessor = new PayloadProcessor(payloadWriter.Version);
Payload actualPayload = payloadProcessor.Process(inStream);
Assert.Equal(payload.SplitIndex, actualPayload.SplitIndex);
Assert.Equal(payload.Version, actualPayload.Version);
Assert.Equal(payload.TaskContext, actualPayload.TaskContext);
Assert.Equal(payload.SparkFilesDir, actualPayload.SparkFilesDir);
Assert.Equal(payload.IncludeItems, actualPayload.IncludeItems);
Assert.Equal(payload.BroadcastVariables.Count, actualPayload.BroadcastVariables.Count);
ValidateCommandPayload(commandPayload, actualPayload.Command);
// Another read will detect that the socket is closed.
Assert.Null(payloadProcessor.Process(inStream));
}
[Fact]
public void TestClosedStreamWithMemoryStream()
{
var inputStream = new MemoryStream();
// Version is not used in this scenario.
var processor = new PayloadProcessor(null);
// Nothing is written to the stream.
Assert.Null(processor.Process(inputStream));
inputStream.Dispose();
// The stream is closed. Payload with null is expected.
Assert.Null(processor.Process(inputStream));
}
private void ValidateCommandPayload(
CommandPayload expected,
Worker.CommandPayload actual)
{
Assert.Equal(expected.EvalType, actual.EvalType);
Assert.Equal(expected.Commands.Length, actual.Commands.Count());
for (int i = 0; i < expected.Commands.Length; ++i)
{
Command expectedCommand = expected.Commands[i];
var actualCommand = (SqlCommand)actual.Commands[i];
Assert.Equal(expectedCommand.ArgOffsets, actualCommand.ArgOffsets);
Assert.Equal(
expectedCommand.ChainedUdfs.Length,
actualCommand.NumChainedFunctions);
Assert.Equal(
expectedCommand.SerializerMode,
actualCommand.SerializerMode);
Assert.Equal(
expectedCommand.DeserializerMode,
actualCommand.DeserializerMode);
}
}
}
}