Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 66 additions & 0 deletions jenner-check/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
# Jenner compatibility tests

[Jenner](https://jenneranalytics.com) is a complete SAS-compatible system
and collaborative workspace. Each `tNNN_*` directory in this folder is a
self-contained test bundle that submits a SAS program to the public API
at `https://api.jenneranalytics.com/v1/run` and checks the response.

## Bundle layout

```
tNNN_*/
├── script.sas # the SAS program
├── autoexec.sas # options + setup that prepend the script
├── input/ # sample data the script reads (if any)
├── expected.json # stable assertions checked on each run
├── expected/ # captured snapshot from the last passing run
│ ├── log.txt # the .log field, verbatim
│ ├── output.txt # the .output (listing) field, verbatim
│ └── files.md # links to ODS images, datasets, etc.
└── meta.json # provenance: source file, blob sha, what was adapted
```

## Running a bundle

The runner concatenates `autoexec.sas` + `script.sas`, POSTs to
`https://api.jenneranalytics.com/v1/run`, and prints the result.

**Mac / Linux (bash + curl):**

```bash
./run_jenner.sh --all # run every tNNN_* bundle, summary at end
./run_jenner.sh t001_something # run one
./run_jenner.sh --list # list bundles in this directory
```

**Windows:**

```cmd
run_jenner.bat tNNN_something
```

**From any SAS session (no curl needed):**

Submit `run_jenner.sas` — it uses PROC HTTP to POST and prints the
response.

**By hand with curl:**

```bash
cat tNNN_*/autoexec.sas tNNN_*/script.sas > /tmp/submit.sas
curl -sS -X POST https://api.jenneranalytics.com/v1/run \
-F "script=@/tmp/submit.sas" \
-F "deterministic=1" -F "timeout=60"
```

**Or in the hosted workspace:**

Open <https://jenneranalytics.com>, paste `script.sas` (with the
`autoexec.sas` lines prepended), upload anything in `input/`, and run.

## Artifact URLs

`expected/files.md` in each bundle lists hosted URLs for any ODS images,
datasets, or other artifacts produced by a captured run. Those URLs are
tied to a specific run and expire when the run is reaped — re-run the
bundle to refresh them.
43 changes: 43 additions & 0 deletions jenner-check/run_jenner.bat
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
@echo off
rem run_jenner.bat - Windows runner for Jenner compatibility checks.
rem
rem Usage: run_jenner.bat <script.sas> [response.json]
rem
rem Submits a single .sas file to api.jenneranalytics.com. For
rem bundle-aware mode (autoexec.sas + script.sas concatenation) on
rem Windows, use WSL and invoke run_jenner.sh instead, or wait for the
rem Windows CI runner that will validate a bundle-aware .bat.
rem
rem Output: response.json contains the API response. Read it back in SAS:
rem filename resp 'response.json';
rem libname resp JSON fileref=resp;
rem proc print data=resp.root; run;
rem
rem Requires: curl.exe (ships with Windows 10+ at C:\Windows\System32).

setlocal

if "%~1"=="" (
echo Usage: %~nx0 ^<script.sas^> [response.json]
exit /b 2
)

set SCRIPT=%~1
set OUT=%~2
if "%OUT%"=="" set OUT=response.json

set HOST=api.jenneranalytics.com

curl.exe -sS -X POST "https://%HOST%/v1/run" ^
-F "script=@%SCRIPT%;type=application/x-sas" ^
-F "deterministic=1" ^
-F "timeout=60" ^
-o "%OUT%"

if errorlevel 1 (
echo curl failed with errorlevel %errorlevel%
exit /b 1
)

echo Response written to %OUT%
exit /b 0
Loading