# SkillScriptExecutorContract

> Tracon documentation. Tracon is a .NET package family that adds a control
> plane on Microsoft Agent Framework, published as NuGet packages that run
> inside your own ASP.NET Core application.
>
> Page: https://tracon.dev/api/tracon.testing.contracts.scripts.skillscriptexecutorcontract/
> Summary: SkillScriptExecutorContract: Behavior tests for an ISkillScriptExecutor: what a script receives, what the executor reports back, and how it stops.

<div class="api-provenance">Namespace Tracon.Testing.Contracts.Scripts · Assembly <code>Tracon.Testing.Contracts.Xunit.dll</code></div>

Behavior tests for an [ISkillScriptExecutor](/api/tracon.iskillscriptexecutor/): what a script
receives, what the executor reports back, and how it stops.

```csharp
public abstract class SkillScriptExecutorContract : IAsyncLifetime, IAsyncDisposable
```

<dl class="api-relations"><dt>Inheritance</dt><dd><a href="https://learn.microsoft.com/dotnet/api/system.object">object</a> ← <a href="/api/tracon.testing.contracts.scripts.skillscriptexecutorcontract/">SkillScriptExecutorContract</a></dd><dt>Implements</dt><dd>IAsyncLifetime, <a href="https://learn.microsoft.com/dotnet/api/system.iasyncdisposable">IAsyncDisposable</a></dd><dt>Inherited Members</dt><dd><a href="https://learn.microsoft.com/dotnet/api/system.object.gettype">object.GetType()</a>, <a href="https://learn.microsoft.com/dotnet/api/system.object.memberwiseclone">object.MemberwiseClone()</a>, <a href="https://learn.microsoft.com/dotnet/api/system.object.tostring">object.ToString()</a>, <a href="https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object)">object.Equals(object?)</a>, <a href="https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object-system-object)">object.Equals(object?, object?)</a>, <a href="https://learn.microsoft.com/dotnet/api/system.object.referenceequals">object.ReferenceEquals(object?, object?)</a>, <a href="https://learn.microsoft.com/dotnet/api/system.object.gethashcode">object.GetHashCode()</a></dd></dl>

## Remarks

Derive one class per executor and return it from
[SkillScriptExecutorContract.CreateExecutorAsync](/api/tracon.testing.contracts.scripts.skillscriptexecutorcontract/#Tracon_Testing_Contracts_Scripts_SkillScriptExecutorContract_CreateExecutorAsync). Every scenario sends a
[SkillScriptOrigin.Stored](/api/tracon.skillscriptorigin/) request whose content is a POSIX
`sh` script, so a remote executor needs no file on the test machine.
An executor for another runtime overrides [SkillScriptExecutorContract.Extension](/api/tracon.testing.contracts.scripts.skillscriptexecutorcontract/#Tracon_Testing_Contracts_Scripts_SkillScriptExecutorContract_Extension),
[SkillScriptExecutorContract.Interpreter](/api/tracon.testing.contracts.scripts.skillscriptexecutorcontract/#Tracon_Testing_Contracts_Scripts_SkillScriptExecutorContract_Interpreter), and the script bodies (the `virtual`
members that end in `Script`); each body's summary says what it must
print.

The scenarios do not check isolation. Whether a script can read the host's
files, network, or process memory depends on where the executor runs it,
and a contract run on the test machine cannot measure that.

## Constructors

### <a id="Tracon_Testing_Contracts_Scripts_SkillScriptExecutorContract__ctor"></a> SkillScriptExecutorContract\(\)

```csharp
protected SkillScriptExecutorContract()
```

## Fields

### <a id="Tracon_Testing_Contracts_Scripts_SkillScriptExecutorContract_ContractSkillName"></a> ContractSkillName

The skill name every request carries.

```csharp
protected const string ContractSkillName = "contract-skill"
```

#### Field Value

 [string](https://learn.microsoft.com/dotnet/api/system.string)

### <a id="Tracon_Testing_Contracts_Scripts_SkillScriptExecutorContract_ExpectedExitCode"></a> ExpectedExitCode

The exit code [SkillScriptExecutorContract.FailingScript](/api/tracon.testing.contracts.scripts.skillscriptexecutorcontract/#Tracon_Testing_Contracts_Scripts_SkillScriptExecutorContract_FailingScript) ends with.

```csharp
protected const int ExpectedExitCode = 3
```

#### Field Value

 [int](https://learn.microsoft.com/dotnet/api/system.int32)

### <a id="Tracon_Testing_Contracts_Scripts_SkillScriptExecutorContract_ExpectedStandardError"></a> ExpectedStandardError

The text [SkillScriptExecutorContract.FailingScript](/api/tracon.testing.contracts.scripts.skillscriptexecutorcontract/#Tracon_Testing_Contracts_Scripts_SkillScriptExecutorContract_FailingScript) writes to standard error.

```csharp
protected const string ExpectedStandardError = "contract-standard-error"
```

#### Field Value

 [string](https://learn.microsoft.com/dotnet/api/system.string)

## Properties

### <a id="Tracon_Testing_Contracts_Scripts_SkillScriptExecutorContract_EmptyScript"></a> EmptyScript

The script with no content at all.

```csharp
protected virtual string EmptyScript { get; }
```

#### Property Value

 [string](https://learn.microsoft.com/dotnet/api/system.string)

### <a id="Tracon_Testing_Contracts_Scripts_SkillScriptExecutorContract_Executor"></a> Executor

The executor under test.

```csharp
protected ISkillScriptExecutor Executor { get; }
```

#### Property Value

 [ISkillScriptExecutor](/api/tracon.iskillscriptexecutor/)

### <a id="Tracon_Testing_Contracts_Scripts_SkillScriptExecutorContract_Extension"></a> Extension

The extension every request carries. Defaults to `sh`.

```csharp
protected virtual string Extension { get; }
```

#### Property Value

 [string](https://learn.microsoft.com/dotnet/api/system.string)

### <a id="Tracon_Testing_Contracts_Scripts_SkillScriptExecutorContract_FailingScript"></a> FailingScript

Writes [SkillScriptExecutorContract.ExpectedStandardError](/api/tracon.testing.contracts.scripts.skillscriptexecutorcontract/#Tracon_Testing_Contracts_Scripts_SkillScriptExecutorContract_ExpectedStandardError) to standard error and exits
with [SkillScriptExecutorContract.ExpectedExitCode](/api/tracon.testing.contracts.scripts.skillscriptexecutorcontract/#Tracon_Testing_Contracts_Scripts_SkillScriptExecutorContract_ExpectedExitCode).

```csharp
protected virtual string FailingScript { get; }
```

#### Property Value

 [string](https://learn.microsoft.com/dotnet/api/system.string)

### <a id="Tracon_Testing_Contracts_Scripts_SkillScriptExecutorContract_FloodScript"></a> FloodScript

Writes the line `0123456789` four hundred times to standard output
(4,400 bytes with line feeds).

```csharp
protected virtual string FloodScript { get; }
```

#### Property Value

 [string](https://learn.microsoft.com/dotnet/api/system.string)

### <a id="Tracon_Testing_Contracts_Scripts_SkillScriptExecutorContract_Interpreter"></a> Interpreter

The interpreter-allow-list value every request carries. Defaults to
`/bin/sh`; a remote executor may expect a runtime name.

```csharp
protected virtual string Interpreter { get; }
```

#### Property Value

 [string](https://learn.microsoft.com/dotnet/api/system.string)

### <a id="Tracon_Testing_Contracts_Scripts_SkillScriptExecutorContract_ReadStandardInputScript"></a> ReadStandardInputScript

Copies standard input to standard output unchanged.

```csharp
protected virtual string ReadStandardInputScript { get; }
```

#### Property Value

 [string](https://learn.microsoft.com/dotnet/api/system.string)

### <a id="Tracon_Testing_Contracts_Scripts_SkillScriptExecutorContract_SkipReason"></a> SkipReason

A reason to skip every scenario, or [null](https://learn.microsoft.com/dotnet/csharp/language-reference/keywords/null) to run them.
The built-in executor returns one when the machine has no `/bin/sh`.

```csharp
protected virtual string? SkipReason { get; }
```

#### Property Value

 [string](https://learn.microsoft.com/dotnet/api/system.string)?

### <a id="Tracon_Testing_Contracts_Scripts_SkillScriptExecutorContract_SleepScript"></a> SleepScript

Runs for at least sixty seconds unless it is stopped.

```csharp
protected virtual string SleepScript { get; }
```

#### Property Value

 [string](https://learn.microsoft.com/dotnet/api/system.string)

### <a id="Tracon_Testing_Contracts_Scripts_SkillScriptExecutorContract_StopTolerance"></a> StopTolerance

The longest time a stopped script may take to return in the timeout and
cancellation scenarios. It is far below [SkillScriptExecutorContract.SleepScript](/api/tracon.testing.contracts.scripts.skillscriptexecutorcontract/#Tracon_Testing_Contracts_Scripts_SkillScriptExecutorContract_SleepScript)'s sixty
seconds, so an executor that waits for the script to finish fails.

```csharp
protected virtual TimeSpan StopTolerance { get; }
```

#### Property Value

 [TimeSpan](https://learn.microsoft.com/dotnet/api/system.timespan)

## Methods

### <a id="Tracon_Testing_Contracts_Scripts_SkillScriptExecutorContract_A_call_without_arguments_reads_an_empty_standard_input"></a> A\_call\_without\_arguments\_reads\_an\_empty\_standard\_input\(\)

```csharp
[Fact]
public Task A_call_without_arguments_reads_an_empty_standard_input()
```

#### Returns

 [Task](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task)

### <a id="Tracon_Testing_Contracts_Scripts_SkillScriptExecutorContract_A_cancelled_call_throws_OperationCanceledException_and_is_not_a_timeout"></a> A\_cancelled\_call\_throws\_OperationCanceledException\_and\_is\_not\_a\_timeout\(\)

```csharp
[Fact]
public Task A_cancelled_call_throws_OperationCanceledException_and_is_not_a_timeout()
```

#### Returns

 [Task](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task)

### <a id="Tracon_Testing_Contracts_Scripts_SkillScriptExecutorContract_A_script_past_its_timeout_is_stopped_and_reported_as_timed_out"></a> A\_script\_past\_its\_timeout\_is\_stopped\_and\_reported\_as\_timed\_out\(\)

```csharp
[Fact]
public Task A_script_past_its_timeout_is_stopped_and_reported_as_timed_out()
```

#### Returns

 [Task](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task)

### <a id="Tracon_Testing_Contracts_Scripts_SkillScriptExecutorContract_A_stored_request_runs_its_content_and_never_a_path"></a> A\_stored\_request\_runs\_its\_content\_and\_never\_a\_path\(\)

```csharp
[Fact]
public Task A_stored_request_runs_its_content_and_never_a_path()
```

#### Returns

 [Task](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task)

### <a id="Tracon_Testing_Contracts_Scripts_SkillScriptExecutorContract_An_empty_script_runs_and_exits_cleanly"></a> An\_empty\_script\_runs\_and\_exits\_cleanly\(\)

```csharp
[Fact]
public Task An_empty_script_runs_and_exits_cleanly()
```

#### Returns

 [Task](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task)

### <a id="Tracon_Testing_Contracts_Scripts_SkillScriptExecutorContract_Arguments_arrive_on_standard_input_as_json"></a> Arguments\_arrive\_on\_standard\_input\_as\_json\(\)

```csharp
[Fact]
public Task Arguments_arrive_on_standard_input_as_json()
```

#### Returns

 [Task](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task)

### <a id="Tracon_Testing_Contracts_Scripts_SkillScriptExecutorContract_Concurrent_calls_do_not_share_a_temp_directory"></a> Concurrent\_calls\_do\_not\_share\_a\_temp\_directory\(\)

```csharp
[Fact]
public Task Concurrent_calls_do_not_share_a_temp_directory()
```

#### Returns

 [Task](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task)

### <a id="Tracon_Testing_Contracts_Scripts_SkillScriptExecutorContract_CreateExecutorAsync"></a> CreateExecutorAsync\(\)

Creates the executor under test.

```csharp
protected abstract ValueTask<ISkillScriptExecutor> CreateExecutorAsync()
```

#### Returns

 [ValueTask](https://learn.microsoft.com/dotnet/api/system.threading.tasks.valuetask\-1)<[ISkillScriptExecutor](/api/tracon.iskillscriptexecutor/)\>

The executor; the same instance serves every call of one test.

### <a id="Tracon_Testing_Contracts_Scripts_SkillScriptExecutorContract_CreateRequest_System_String_System_String_System_String_System_Nullable_System_TimeSpan__System_Int32_"></a> CreateRequest\(string, string, string?, TimeSpan?, int\)

Builds a request for one scenario.

```csharp
protected virtual SkillScriptExecutionRequest CreateRequest(string scriptName, string content, string? argumentsJson = null, TimeSpan? timeout = null, int maxOutputBytes = 65536)
```

#### Parameters

`scriptName` [string](https://learn.microsoft.com/dotnet/api/system.string)

The script name, a plain file name.

`content` [string](https://learn.microsoft.com/dotnet/api/system.string)

The script body.

`argumentsJson` [string](https://learn.microsoft.com/dotnet/api/system.string)?

The JSON for standard input, or [null](https://learn.microsoft.com/dotnet/csharp/language-reference/keywords/null).

`timeout` [TimeSpan](https://learn.microsoft.com/dotnet/api/system.timespan)?

The script timeout; thirty seconds when [null](https://learn.microsoft.com/dotnet/csharp/language-reference/keywords/null).

`maxOutputBytes` [int](https://learn.microsoft.com/dotnet/api/system.int32)

The byte limit for each output stream.

#### Returns

 [SkillScriptExecutionRequest](/api/tracon.skillscriptexecutionrequest/)

A [SkillScriptOrigin.Stored](/api/tracon.skillscriptorigin/) request with its content hash computed.

### <a id="Tracon_Testing_Contracts_Scripts_SkillScriptExecutorContract_DisposeAsync"></a> DisposeAsync\(\)

```csharp
public ValueTask DisposeAsync()
```

#### Returns

 [ValueTask](https://learn.microsoft.com/dotnet/api/system.threading.tasks.valuetask)

### <a id="Tracon_Testing_Contracts_Scripts_SkillScriptExecutorContract_EchoScript_System_String_"></a> EchoScript\(string\)

Prints `text` and a line break.

```csharp
protected virtual string EchoScript(string text)
```

#### Parameters

`text` [string](https://learn.microsoft.com/dotnet/api/system.string)

A word of ASCII letters and hyphens.

#### Returns

 [string](https://learn.microsoft.com/dotnet/api/system.string)

The script body.

### <a id="Tracon_Testing_Contracts_Scripts_SkillScriptExecutorContract_EnvironmentScript_System_String_"></a> EnvironmentScript\(string\)

Prints `[<TRACON_SKILL_NAME>][<present when TRACON_SKILL_TEMP is set>][<value of hostVariable>]`.

```csharp
protected virtual string EnvironmentScript(string hostVariable)
```

#### Parameters

`hostVariable` [string](https://learn.microsoft.com/dotnet/api/system.string)

The name of a variable set in the test process.

#### Returns

 [string](https://learn.microsoft.com/dotnet/api/system.string)

The script body.

### <a id="Tracon_Testing_Contracts_Scripts_SkillScriptExecutorContract_InitializeAsync"></a> InitializeAsync\(\)

Called immediately after the class has been created, before it is used.

```csharp
public ValueTask InitializeAsync()
```

#### Returns

 [ValueTask](https://learn.microsoft.com/dotnet/api/system.threading.tasks.valuetask)

### <a id="Tracon_Testing_Contracts_Scripts_SkillScriptExecutorContract_Output_past_the_limit_is_cut_and_flagged_without_a_notice"></a> Output\_past\_the\_limit\_is\_cut\_and\_flagged\_without\_a\_notice\(\)

```csharp
[Fact]
public Task Output_past_the_limit_is_cut_and_flagged_without_a_notice()
```

#### Returns

 [Task](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task)

### <a id="Tracon_Testing_Contracts_Scripts_SkillScriptExecutorContract_TempMarkerScript_System_String_"></a> TempMarkerScript\(string\)

Writes a file named `marker` into `TRACON_SKILL_TEMP`,
waits a second so that a concurrent call can do the same, and then lists
the directory's file names, one per line.

```csharp
protected virtual string TempMarkerScript(string marker)
```

#### Parameters

`marker` [string](https://learn.microsoft.com/dotnet/api/system.string)

A word of ASCII letters.

#### Returns

 [string](https://learn.microsoft.com/dotnet/api/system.string)

The script body.

### <a id="Tracon_Testing_Contracts_Scripts_SkillScriptExecutorContract_The_exit_code_and_standard_error_are_reported"></a> The\_exit\_code\_and\_standard\_error\_are\_reported\(\)

```csharp
[Fact]
public Task The_exit_code_and_standard_error_are_reported()
```

#### Returns

 [Task](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task)

### <a id="Tracon_Testing_Contracts_Scripts_SkillScriptExecutorContract_The_script_sees_its_two_variables_and_not_the_host_environment"></a> The\_script\_sees\_its\_two\_variables\_and\_not\_the\_host\_environment\(\)

```csharp
[Fact]
public Task The_script_sees_its_two_variables_and_not_the_host_environment()
```

#### Returns

 [Task](https://learn.microsoft.com/dotnet/api/system.threading.tasks.task)
