Skip to content

Commit 69f118f

Browse files
committed
fix PrepareUdpPortAsync to update the handle of the newly listened ECHONET Lite port
1 parent d9523cc commit 69f118f

2 files changed

Lines changed: 101 additions & 0 deletions

File tree

src/Smdn.Net.SkStackIP/Smdn.Net.SkStackIP/SkStackClient.Functions.UDP.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,9 @@ static bool TryFindPort(
135135
cancellationToken: cancellationToken
136136
).ConfigureAwait(false);
137137

138+
if (newlyListeningPort.Port == SkStackKnownPortNumbers.EchonetLite)
139+
udpPortHandleForEchonetLite = newlyListeningPort.Handle;
140+
138141
return newlyListeningPort;
139142
}
140143

tests/Smdn.Net.SkStackIP/Smdn.Net.SkStackIP/SkStackClient.Functions.UDP.cs

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,104 @@ public void PrepareUdpPortAsync_AlreadyListening(int port, SkStackUdpPortHandle
283283
);
284284
}
285285

286+
[Test]
287+
public void PrepareUdpPortAsync_EchonetLite()
288+
{
289+
using var stream = new PseudoSkStackStream();
290+
using var client = new SkStackClient(stream, logger: CreateLoggerForTestCase());
291+
292+
Assert.That(
293+
async () => await client.SendUdpEchonetLiteAsync(buffer: new byte[] { 0x00 }),
294+
Throws
295+
.InvalidOperationException
296+
.With
297+
.Property(nameof(InvalidOperationException.Message))
298+
.Contains("not listening")
299+
);
300+
301+
const SkStackUdpPortHandle PortHandle = SkStackUdpPortHandle.Handle1;
302+
303+
// SKTABLE E
304+
stream.ResponseWriter.WriteLine("EPORT");
305+
stream.ResponseWriter.WriteLine("0"); // #1
306+
stream.ResponseWriter.WriteLine("0"); // #2
307+
stream.ResponseWriter.WriteLine("0"); // #3
308+
stream.ResponseWriter.WriteLine("0"); // #4
309+
stream.ResponseWriter.WriteLine("0"); // #5
310+
stream.ResponseWriter.WriteLine("0"); // #6
311+
stream.ResponseWriter.WriteLine("OK");
312+
// SKUDPPORT
313+
stream.ResponseWriter.WriteLine("OK");
314+
315+
SkStackUdpPort preparedPort = default;
316+
317+
Assert.DoesNotThrowAsync(
318+
async () => preparedPort = await client.PrepareUdpPortAsync(SkStackKnownPortNumbers.EchonetLite)
319+
);
320+
321+
Assert.That(preparedPort.IsUnused, Is.False);
322+
Assert.That(preparedPort.Handle, Is.EqualTo(PortHandle), nameof(preparedPort.Handle));
323+
Assert.That(preparedPort.Port, Is.EqualTo(SkStackKnownPortNumbers.EchonetLite), nameof(preparedPort.Port));
324+
325+
Assert.That(
326+
async () => await client.SendUdpEchonetLiteAsync(buffer: new byte[] { 0x00 }),
327+
Throws.InstanceOf<SkStackPanaSessionStateException>()
328+
);
329+
330+
Assert.That(
331+
stream.ReadSentData(),
332+
SequenceIs.EqualTo($"SKTABLE E\r\nSKUDPPORT {(int)PortHandle} {SkStackKnownPortNumbers.EchonetLite:X4}\r\n".ToByteSequence())
333+
);
334+
}
335+
336+
[Test]
337+
public void PrepareUdpPortAsync_EchonetLite_AlreadyListening()
338+
{
339+
using var stream = new PseudoSkStackStream();
340+
using var client = new SkStackClient(stream, logger: CreateLoggerForTestCase());
341+
342+
Assert.That(
343+
async () => await client.SendUdpEchonetLiteAsync(buffer: new byte[] { 0x00 }),
344+
Throws
345+
.InvalidOperationException
346+
.With
347+
.Property(nameof(InvalidOperationException.Message))
348+
.Contains("not listening")
349+
);
350+
351+
const SkStackUdpPortHandle PortHandle = SkStackUdpPortHandle.Handle3;
352+
353+
// SKTABLE E
354+
stream.ResponseWriter.WriteLine("EPORT");
355+
stream.ResponseWriter.WriteLine("0"); // #1
356+
stream.ResponseWriter.WriteLine("0"); // #2
357+
stream.ResponseWriter.WriteLine($"{SkStackKnownPortNumbers.EchonetLite:D}"); // #3
358+
stream.ResponseWriter.WriteLine("0"); // #4
359+
stream.ResponseWriter.WriteLine("0"); // #5
360+
stream.ResponseWriter.WriteLine("0"); // #6
361+
stream.ResponseWriter.WriteLine("OK");
362+
363+
SkStackUdpPort preparedPort = default;
364+
365+
Assert.DoesNotThrowAsync(
366+
async () => preparedPort = await client.PrepareUdpPortAsync(SkStackKnownPortNumbers.EchonetLite)
367+
);
368+
369+
Assert.That(preparedPort.IsUnused, Is.False);
370+
Assert.That(preparedPort.Handle, Is.EqualTo(PortHandle), nameof(preparedPort.Handle));
371+
Assert.That(preparedPort.Port, Is.EqualTo(SkStackKnownPortNumbers.EchonetLite), nameof(preparedPort.Port));
372+
373+
Assert.That(
374+
async () => await client.SendUdpEchonetLiteAsync(buffer: new byte[] { 0x00 }),
375+
Throws.InstanceOf<SkStackPanaSessionStateException>()
376+
);
377+
378+
Assert.That(
379+
stream.ReadSentData(),
380+
SequenceIs.EqualTo("SKTABLE E\r\n".ToByteSequence())
381+
);
382+
}
383+
286384
[Test]
287385
public void PrepareUdpPortAsync_NoUnusedPorts()
288386
{

0 commit comments

Comments
 (0)