Esempio n. 1
0
        public async Task Shows_informative_exception_information()
        {
            var scheduler = CreateScheduler();
            var request   = Envelope.Create(
                new ExecuteRequest(@"
void ThrowTheException() => throw new ArgumentException();
ThrowTheException();
"));
            var context = new JupyterRequestContext(JupyterMessageSender, request);

            await scheduler.Schedule(context);

            await context.Done().Timeout(5.Seconds());

            var traceback = JupyterMessageSender
                            .PubSubMessages
                            .Should()
                            .ContainSingle(e => e is Error)
                            .Which
                            .As <Error>()
                            .Traceback;

            string.Join("\n", traceback)
            .Should()
            .StartWith("System.ArgumentException: Value does not fall within the expected range")
            .And
            .Contain("ThrowTheException", because: "the stack trace should also be present");
        }
        private void OnLogEvent(
            DiagnosticLogEntryProduced logEvent,
            ZeroMQMessage request,
            IJupyterMessageSender jupyterMessageSender)
        {
            var transient = CreateTransient();

            var span = _textSpanFormatter.ParseToSpan($"{Ansi.Color.Foreground.DarkGray}{logEvent.Message}{Ansi.Text.AttributesOff}");

            var message = span.ToString(OutputMode.Ansi);

            var dataMessage = new DisplayData(
                transient: transient,
                data: new Dictionary <string, object> {
                [PlainTextFormatter.MimeType] = message
            });

            var isSilent = ((ExecuteRequest)request.Content).Silent;

            if (!isSilent)
            {
                // send on io
                jupyterMessageSender.Send(dataMessage);
            }
        }
        private void OnDisplayEvent(DisplayEventBase displayEvent,
                                    ZeroMQMessage request,
                                    IJupyterMessageSender jupyterMessageSender)
        {
            if (displayEvent is ReturnValueProduced && displayEvent.Value is DisplayedValue)
            {
                return;
            }

            var transient = CreateTransient(displayEvent.ValueId);

            var formattedValues = displayEvent
                                  .FormattedValues
                                  .ToDictionary(k => k.MimeType, v => PreserveJson(v.MimeType, v.Value));

            var           value = displayEvent.Value;
            PubSubMessage dataMessage;

            switch (displayEvent)
            {
            case DisplayedValueProduced _:
                dataMessage = new DisplayData(
                    transient: transient,
                    data: formattedValues);
                break;

            case DisplayedValueUpdated _:
                dataMessage = new UpdateDisplayData(
                    transient: transient,
                    data: formattedValues);
                break;

            case ReturnValueProduced _:
                dataMessage = new ExecuteResult(
                    _executionCount,
                    transient: transient,
                    data: formattedValues);
                break;

            case StandardOutputValueProduced _:
                dataMessage = Stream.StdOut(GetPlainTextValueOrDefault(formattedValues, value?.ToString() ?? string.Empty));
                break;

            case StandardErrorValueProduced _:
            case ErrorProduced _:
                dataMessage = Stream.StdErr(GetPlainTextValueOrDefault(formattedValues, value?.ToString() ?? string.Empty));
                break;

            default:
                throw new ArgumentException("Unsupported event type", nameof(displayEvent));
            }

            var isSilent = ((ExecuteRequest)request.Content).Silent;

            if (!isSilent)
            {
                // send on io
                jupyterMessageSender.Send(dataMessage);
            }
        }
        public void cell_language_defaults_to_null_when_it_cant_be_found()
        {
            var request  = ZeroMQMessage.Create(new IsCompleteRequest("1+1"));
            var context  = new JupyterRequestContext(JupyterMessageSender, request);
            var language = context.GetLanguage();

            language
            .Should()
            .BeNull();
        }
        private void Reply(bool isComplete, ZeroMQMessage request, IJupyterMessageSender jupyterMessageSender)
        {
            var status = isComplete ? "complete" : "incomplete";
            var indent = isComplete ? string.Empty : "*";
            // reply
            var isCompleteReplyPayload = new IsCompleteReply(indent: indent, status: status);

            // send to server
            jupyterMessageSender.Send(isCompleteReplyPayload);
        }
Esempio n. 6
0
        public async Task sends_ExecuteReply_with_error_message_on_when_code_submission_contains_errors()
        {
            var scheduler = CreateScheduler();
            var request   = Envelope.Create(new ExecuteRequest("asdes"), null);
            var context   = new JupyterRequestContext(JupyterMessageSender, request, "id");
            await scheduler.Schedule(context);

            await context.Done().Timeout(5.Seconds());

            JupyterMessageSender.ReplyMessages.Should().ContainItemsAssignableTo <ExecuteReplyError>();
        }
        public async Task sends_ExecuteReply_message_when_submission_contains_only_a_directive()
        {
            var scheduler = CreateScheduler();
            var request   = ZeroMQMessage.Create(new ExecuteRequest("#!csharp"));
            var context   = new JupyterRequestContext(JupyterMessageSender, request);
            await scheduler.Schedule(context);

            await context.Done().Timeout(5.Seconds());

            JupyterMessageSender.ReplyMessages.Should().ContainItemsAssignableTo <ExecuteReplyOk>();
        }
Esempio n. 8
0
        public async Task sends_DisplayData_message_on_ValueProduced()
        {
            var scheduler = CreateScheduler();
            var request   = Envelope.Create(new ExecuteRequest("Console.WriteLine(2+2);"), null);
            var context   = new JupyterRequestContext(JupyterMessageSender, request, "id");
            await scheduler.Schedule(context);

            await context.Done().Timeout(20.Seconds());

            JupyterMessageSender.PubSubMessages.Should().Contain(r => r is DisplayData);
        }
        public async Task sends_ExecuteReply_message_on_ReturnValueProduced()
        {
            var scheduler = CreateScheduler();
            var request   = ZeroMQMessage.Create(new ExecuteRequest("2+2"));
            var context   = new JupyterRequestContext(JupyterMessageSender, request);
            await scheduler.Schedule(context);

            await context.Done().Timeout(20.Seconds());

            JupyterMessageSender.PubSubMessages.Should().Contain(r => r is ExecuteResult);
        }
        public async Task sends_Stream_message_on_StandardErrorValueProduced()
        {
            var scheduler = CreateScheduler();
            var request   = ZeroMQMessage.Create(new ExecuteRequest("Console.Error.WriteLine(2+2);"));
            var context   = new JupyterRequestContext(JupyterMessageSender, request);
            await scheduler.Schedule(context);

            await context.Done().Timeout(20.Seconds());

            JupyterMessageSender.PubSubMessages.Should().Contain(r => r is Stream && r.As <Stream>().Name == Stream.StandardError);
        }
        public async Task sends_isCompleteReply_with_incomplete_and_indent_if_the_code_is_not_a_complete_submission()
        {
            var scheduler = CreateScheduler();
            var request   = ZeroMQMessage.Create(new IsCompleteRequest("var a = 12"), null);
            var context   = new JupyterRequestContext(JupyterMessageSender, request);

            await scheduler.Schedule(context);

            await context.Done().Timeout(5.Seconds());

            JupyterMessageSender.ReplyMessages.OfType <IsCompleteReply>().Should().ContainSingle(r => r.Status == "incomplete" && r.Indent == "*");
        }
Esempio n. 12
0
        private static void SendDisplayData(PubSubMessage messageMessage,
                                            Envelope request,
                                            IJupyterMessageSender ioPubChannel)
        {
            var isSilent = ((ExecuteRequest)request.Content).Silent;

            if (!isSilent)
            {
                // send on io
                ioPubChannel.Send(messageMessage);
            }
        }
        public async Task does_not_send_ExecuteResult_message_when_evaluating_display_value(Language language)
        {
            var scheduler = CreateScheduler();

            SetKernelLanguage(language);
            var request = ZeroMQMessage.Create(new ExecuteRequest("display(2+2)"));
            var context = new JupyterRequestContext(JupyterMessageSender, request);
            await scheduler.Schedule(context);

            await context.Done().Timeout(20.Seconds());

            JupyterMessageSender.PubSubMessages.Should().NotContain(r => r is ExecuteResult);
        }
        public async Task sends_DisplayData_message_with_json_when_json_mimetype_is_requested()
        {
            var scheduler = CreateScheduler();
            var request   = ZeroMQMessage.Create(new ExecuteRequest(@"display(2+2,""application/json"");"));
            var context   = new JupyterRequestContext(JupyterMessageSender, request);
            await scheduler.Schedule(context);

            await context.Done().Timeout(20.Seconds());

            JupyterMessageSender.PubSubMessages
            .Should()
            .ContainSingle <DisplayData>(r => r.Data["application/json"] is JToken token && token.Type == JTokenType.Integer);
        }
Esempio n. 15
0
        public async Task sends_isCompleteReply_with_complete_if_the_code_is_a_complete_submission()
        {
            var scheduler = CreateScheduler();
            var request   = Envelope
                            .Create(new IsCompleteRequest("var a = 12;"), null);
            var context = new JupyterRequestContext(JupyterMessageSender, request, "id");

            await scheduler.Schedule(context);

            await context.Done().Timeout(5.Seconds());

            JupyterMessageSender.ReplyMessages.OfType <IsCompleteReply>().Should().ContainSingle(r => r.Status == "complete");
        }
Esempio n. 16
0
        public async Task sends_ExecuteReply_message_on_when_code_submission_is_handled()
        {
            var scheduler = CreateScheduler();
            var request   = Envelope.Create(new ExecuteRequest("var a =12;"));
            var context   = new JupyterRequestContext(JupyterMessageSender, request);
            await scheduler.Schedule(context);

            await context.Done().Timeout(5.Seconds());

            JupyterMessageSender.ReplyMessages
            .Should()
            .ContainItemsAssignableTo <ExecuteReplyOk>();
        }
        public async Task send_completeReply_on_CompleteRequest()
        {
            var scheduler = CreateScheduler();
            var request   = ZeroMQMessage.Create(new CompleteRequest("System.Console.", 15));
            var context   = new JupyterRequestContext(JupyterMessageSender, request);

            await scheduler.Schedule(context);

            await context.Done().Timeout(5.Seconds());

            JupyterMessageSender.ReplyMessages
            .Should()
            .ContainSingle(r => r is CompleteReply);
        }
        public async Task sends_InterruptReply()
        {
            var scheduler = CreateScheduler();
            var request   = ZeroMQMessage.Create(new InterruptRequest(), null);
            var context   = new JupyterRequestContext(JupyterMessageSender, request);

            await scheduler.Schedule(context);

            await context.Done().Timeout(5.Seconds());

            JupyterMessageSender.ReplyMessages
            .Should()
            .ContainSingle(r => r is InterruptReply);
        }
        public async Task sends_ExecuteInput_when_ExecuteRequest_is_handled()
        {
            var scheduler = CreateScheduler();
            var request   = ZeroMQMessage.Create(new ExecuteRequest("var a =12;"));
            var context   = new JupyterRequestContext(JupyterMessageSender, request);
            await scheduler.Schedule(context);

            await context.Done().Timeout(5.Seconds());

            JupyterMessageSender.PubSubMessages.Should()
            .ContainItemsAssignableTo <ExecuteInput>();

            JupyterMessageSender.PubSubMessages.OfType <ExecuteInput>().Should().Contain(r => r.Code == "var a =12;");
        }
        public void cell_language_can_be_pulled_from_metadata_when_present()
        {
            var metaData = new Dictionary <string, object>
            {
                { "dotnet_interactive", new InputCellMetadata("fsharp") }
            };
            var request  = ZeroMQMessage.Create(new IsCompleteRequest("1+1"), metaData: metaData);
            var context  = new JupyterRequestContext(JupyterMessageSender, request);
            var language = context.GetLanguage();

            language
            .Should()
            .Be("fsharp");
        }
        public async Task sends_InputRequest_message_when_submission_requests_user_password_in_csharp(string code, string prompt)
        {
            var scheduler = CreateScheduler();
            var request   = ZeroMQMessage.Create(new ExecuteRequest(code));
            var context   = new JupyterRequestContext(JupyterMessageSender, request);
            await scheduler.Schedule(context);

            await context.Done().Timeout(20.Seconds());

            JupyterMessageSender.RequestMessages.Should().Contain(r => r.Prompt == prompt && r.Password);
            JupyterMessageSender.PubSubMessages
            .OfType <ExecuteResult>()
            .Should()
            .Contain(dp => dp.Data["text/html"] as string == $"{typeof(PasswordString).FullName}");
        }
        public async Task password_input_should_not_appear_in_diagnostic_logs()
        {
            var log = new System.Text.StringBuilder();

            using var _ = LogEvents.Subscribe(e => log.Append(e.ToLogString()));

            var scheduler = CreateScheduler();
            var request   = ZeroMQMessage.Create(new ExecuteRequest("password(\"Password:\")"));
            var context   = new JupyterRequestContext(JupyterMessageSender, request);
            await scheduler.Schedule(context);

            await context.Done().Timeout(20.Seconds());

            log.ToString().Should().NotContain("secret");
        }
        public async Task sends_InputRequest_message_when_submission_requests_user_input_in_csharp(string code, string prompt, string expectedDisplayValue)
        {
            var scheduler = CreateScheduler();
            var request   = ZeroMQMessage.Create(new ExecuteRequest(code));
            var context   = new JupyterRequestContext(JupyterMessageSender, request);
            await scheduler.Schedule(context);

            await context.Done().Timeout(20.Seconds());

            JupyterMessageSender.RequestMessages.Should().Contain(r => r.Prompt == prompt && r.Password == false);
            JupyterMessageSender.PubSubMessages
            .OfType <ExecuteResult>()
            .Should()
            .Contain(dp => dp.Data["text/plain"] as string == expectedDisplayValue);
        }
Esempio n. 24
0
        public async Task does_display_MathString_values_on_ReturnValueProduced(Language language, string code, string expectedDisplayValue)
        {
            var scheduler = CreateScheduler();

            SetKernelLanguage(language);
            var request = ZeroMQMessage.Create(new ExecuteRequest(code));
            var context = new JupyterRequestContext(JupyterMessageSender, request);
            await scheduler.Schedule(context);

            await context.Done().Timeout(20.Seconds());

            JupyterMessageSender.PubSubMessages
            .OfType <ExecuteResult>()
            .Should()
            .Contain(dp => dp.Data["text/latex"] as string == expectedDisplayValue);
        }
Esempio n. 25
0
        public async Task does_not_expose_stacktrace_when_code_submission_contains_errors()
        {
            var scheduler = CreateScheduler();
            var request   = ZeroMQMessage.Create(new ExecuteRequest("asdes asdasd"));
            var context   = new JupyterRequestContext(JupyterMessageSender, request);
            await scheduler.Schedule(context);

            await context.Done().Timeout(5.Seconds());

            JupyterMessageSender.PubSubMessages.Should()
            .ContainSingle <Stream>()
            .Which
            .Text
            .Should()
            .ContainAll("(1,13): error CS1002:", ";");
        }
        public async Task does_not_expose_stacktrace_when_code_submission_contains_errors()
        {
            var scheduler = CreateScheduler();
            var request   = ZeroMQMessage.Create(new ExecuteRequest("asdes asdasd"));
            var context   = new JupyterRequestContext(JupyterMessageSender, request);
            await scheduler.Schedule(context);

            await context.Done().Timeout(5.Seconds());

            JupyterMessageSender.PubSubMessages.Should()
            .ContainSingle(e => e is Error)
            .Which.As <Error>()
            .Traceback
            .Should()
            .BeEquivalentTo("(1,13): error CS1002: ; expected");
        }
        public async Task sends_InputRequest_message_when_submission_requests_user_password_in_powershell(string code, string prompt)
        {
            SetKernelLanguage(Language.PowerShell);

            var scheduler = CreateScheduler();
            var request   = ZeroMQMessage.Create(new ExecuteRequest(code));
            var context   = new JupyterRequestContext(JupyterMessageSender, request);
            await scheduler.Schedule(context);

            await context.Done().Timeout(20.Seconds());

            JupyterMessageSender.RequestMessages.Should().Contain(r => r.Prompt == prompt && r.Password == true);
            JupyterMessageSender.PubSubMessages
            .OfType <Stream>()
            .Should()
            .Contain(s => s.Name == Stream.StandardOutput && s.Text == $"System.Security.SecureString{Environment.NewLine}");
        }
        public async Task shows_diagnostics_on_erroneous_input(Language language, string expected)
        {
            var scheduler = CreateScheduler();

            SetKernelLanguage(language);
            var request = ZeroMQMessage.Create(new ExecuteRequest("1+!"));
            var context = new JupyterRequestContext(JupyterMessageSender, request);
            await scheduler.Schedule(context);

            await context.Done().Timeout(5.Seconds());

            JupyterMessageSender.PubSubMessages.Should()
            .ContainSingle <Stream>()
            .Which
            .Text
            .Should()
            .Contain(expected);
        }
Esempio n. 29
0
        private void OnDisplayEvent(DisplayEventBase displayEvent,
                                    Envelope request,
                                    IJupyterMessageSender jupyterMessageSender)
        {
            var transient = CreateTransient(displayEvent.ValueId);

            var formattedValues = displayEvent
                                  .FormattedValues
                                  .ToDictionary(k => k.MimeType, v => v.Value);

            var value = displayEvent.Value;

            CreateDefaultFormattedValueIfEmpty(formattedValues, value);

            PubSubMessage executeResultData;

            switch (displayEvent)
            {
            case DisplayedValueProduced _:
                executeResultData = new DisplayData(
                    transient: transient,
                    data: formattedValues);
                break;

            case DisplayedValueUpdated _:
                executeResultData = new UpdateDisplayData(
                    transient: transient,
                    data: formattedValues);
                break;

            case ReturnValueProduced _:
                executeResultData = new ExecuteResult(
                    _executionCount,
                    transient: transient,
                    data: formattedValues);
                break;

            default:
                throw new ArgumentException("Unsupported event type", nameof(displayEvent));
            }

            SendDisplayData(executeResultData, request, jupyterMessageSender);
        }
        public async Task sends_ExecuteReply_message_on_ReturnValueProduced()
        {
            var scheduler = CreateScheduler();
            var request   = ZeroMQMessage.Create(new ExecuteRequest("2+2"));
            var context   = new JupyterRequestContext(JupyterMessageSender, request);
            await scheduler.Schedule(context);

            await context.Done().Timeout(20.Seconds());

            using var _ = new AssertionScope();

            JupyterMessageSender.PubSubMessages
            .Should()
            .ContainSingle <ExecuteResult>()
            .Which
            .Data
            .Should()
            .ContainSingle(d => d.Key.Equals("text/html") && d.Value.Equals("<div class=\"dni-plaintext\">4</div>"));
        }