2018-03-20 16:03:28 +11:00
/ *
* These tests are for the netcoreapp2 . 1 version of the client ( there are separate tests for netstandard that don ' t actually connect to a server ) .
* /
using System ;
using System.Collections.Generic ;
using System.Diagnostics ;
using System.Net.WebSockets ;
using System.Text ;
using System.Threading ;
using System.Threading.Tasks ;
using Microsoft.Extensions.Logging ;
using Microsoft.Rest ;
using Xunit ;
using Xunit.Abstractions ;
namespace k8s.Tests
{
/// <summary>
/// Tests for <see cref="KubeApiClient"/>'s exec-in-pod functionality.
/// </summary>
public class PodExecTests
: WebSocketTestBase
{
2018-04-28 05:40:47 +02:00
private readonly ITestOutputHelper testOutput ;
2018-03-20 16:03:28 +11:00
/// <summary>
/// Create a new <see cref="KubeApiClient"/> exec-in-pod test suite.
/// </summary>
/// <param name="testOutput">
/// Output for the current test.
/// </param>
public PodExecTests ( ITestOutputHelper testOutput )
: base ( testOutput )
{
2018-04-28 05:40:47 +02:00
this . testOutput = testOutput ;
2018-03-20 16:03:28 +11:00
}
/// <summary>
/// Verify that the client can request execution of a command in a pod's default container, with only the STDOUT stream enabled.
/// </summary>
[Fact(DisplayName = "Can exec in pod's default container, STDOUT only")]
public async Task Exec_DefaultContainer_StdOut ( )
{
if ( ! Debugger . IsAttached )
{
CancellationSource . CancelAfter (
TimeSpan . FromSeconds ( 5 )
) ;
}
await Host . StartAsync ( TestCancellation ) ;
using ( Kubernetes client = CreateTestClient ( ) )
{
2018-04-28 05:40:47 +02:00
testOutput . WriteLine ( "Invoking exec operation..." ) ;
2018-03-20 16:03:28 +11:00
WebSocket clientSocket = await client . WebSocketNamespacedPodExecAsync (
name : "mypod" ,
@namespace : "mynamespace" ,
2018-03-31 07:56:52 +02:00
command : new string [ ] { "/bin/bash" } ,
2018-03-20 16:03:28 +11:00
container : "mycontainer" ,
stderr : false ,
stdin : false ,
stdout : true ,
2018-05-03 07:02:05 +02:00
webSocketSubProtol : WebSocketProtocol . ChannelWebSocketProtocol ,
2018-03-20 16:03:28 +11:00
cancellationToken : TestCancellation
) ;
2018-05-03 07:02:05 +02:00
Assert . Equal ( WebSocketProtocol . ChannelWebSocketProtocol , clientSocket . SubProtocol ) ; // For WebSockets, the Kubernetes API defaults to the binary channel (v1) protocol.
2018-03-20 16:03:28 +11:00
2018-04-28 05:40:47 +02:00
testOutput . WriteLine ( $"Client socket connected (socket state is {clientSocket.State}). Waiting for server-side socket to become available..." ) ;
2018-03-20 16:03:28 +11:00
WebSocket serverSocket = await WebSocketTestAdapter . AcceptedPodExecV1Connection ;
2018-04-28 05:40:47 +02:00
testOutput . WriteLine ( $"Server-side socket is now available (socket state is {serverSocket.State}). Sending data to server socket..." ) ;
2018-03-20 16:03:28 +11:00
const int STDOUT = 1 ;
const string expectedOutput = "This is text send to STDOUT." ;
int bytesSent = await SendMultiplexed ( serverSocket , STDOUT , expectedOutput ) ;
2018-04-28 05:40:47 +02:00
testOutput . WriteLine ( $"Sent {bytesSent} bytes to server socket; receiving from client socket..." ) ;
2018-03-20 16:03:28 +11:00
( string receivedText , byte streamIndex , int bytesReceived ) = await ReceiveTextMultiplexed ( clientSocket ) ;
2018-04-28 05:40:47 +02:00
testOutput . WriteLine ( $"Received {bytesReceived} bytes from client socket ('{receivedText}', stream {streamIndex})." ) ;
2018-03-20 16:03:28 +11:00
Assert . Equal ( STDOUT , streamIndex ) ;
Assert . Equal ( expectedOutput , receivedText ) ;
await Disconnect ( clientSocket , serverSocket ,
closeStatus : WebSocketCloseStatus . NormalClosure ,
closeStatusDescription : "Normal Closure"
) ;
WebSocketTestAdapter . CompleteTest ( ) ;
}
}
}
}