#!/bin/sh
# Drives a fake WebDriver endpoint on loopback, entirely offline.
set -eu

work=$(mktemp -d)
export HOME="$work"
trap 'rm -rf "$work"' EXIT INT TERM

DART=$(command -v dart 2>/dev/null || true)
[ -n "$DART" ] || DART=/usr/lib/dart/bin/dart

# Register every installed Dart package so the imports resolve.
mkdir -p "$work/.dart_tool"
{
    printf '{"configVersion":2,"packages":['
    first=1
    for dir in /usr/share/dart/packages/*/; do
        name=$(basename "$dir")
        [ "$first" -eq 1 ] || printf ','
        first=0
        printf '{"name":"%s","rootUri":"file:///usr/share/dart/packages/%s","packageUri":"lib/"}' "$name" "$name"
    done
    printf ']}\n'
} > "$work/.dart_tool/package_config.json"

cat > "$work/main.dart" <<'DART'
import 'dart:convert';
import 'dart:io';

import 'package:webdriver/async_io.dart';

Future<void> main() async {
  final server = await HttpServer.bind(InternetAddress.loopbackIPv4, 0);
  String? navigatedTo;
  var navigations = 0;

  server.listen((request) async {
    final path = request.uri.path;
    final response = request.response..headers.contentType = ContentType.json;
    if (path == '/session/abc/url' && request.method == 'POST') {
      final body = json.decode(await utf8.decoder.bind(request).join()) as Map;
      navigatedTo = body['url'] as String?;
      navigations++;
      response.write('{"value":null}');
    } else if (path == '/session/abc/url' && request.method == 'GET') {
      response.write(json.encode({'value': navigatedTo ?? 'about:blank'}));
    } else if (path == '/session/abc' && request.method == 'DELETE') {
      response.write('{"value":null}');
    } else {
      response.statusCode = 404;
      response.write(json.encode({
        'value': {'error': 'unknown command', 'message': path}
      }));
    }
    await response.close();
  });

  final driver = await fromExistingSession('abc',
      uri: Uri.parse('http://127.0.0.1:${server.port}/'),
      spec: WebDriverSpec.W3c);

  await driver.get(Uri.parse('https://example.com/'));
  final url = await driver.currentUrl;
  if (navigations != 1) {
    throw StateError('expected one navigation, got $navigations');
  }
  if (url != 'https://example.com/') {
    throw StateError('unexpected url $url');
  }

  await driver.quit();
  await server.close(force: true);
  print('webdriver smoke test passed');
}
DART

cd "$work"
"$DART" run main.dart
