#!/bin/sh
# Smoke test for the installed Flutter libraries; runs offline via dart analyze,
# with dart:ui resolved through sky_engine's _embedder.yaml.
#
# The framework gets a small consumer program, since that is how applications
# use it.  flutter_driver and integration_test are analysed source by source
# instead: a consumer-only check still passes when the library's own imports are
# broken, because the analyser does not report errors inside an imported file.
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

PKGROOT=/usr/share/dart/packages

# Language version of a package, taken from its own pubspec.
langver() {
	awk '/^environment:/{f=1;next} f&&/^ *sdk:/{print;exit}' \
		"$PKGROOT/$1/pubspec.yaml" 2>/dev/null |
		sed -e 's/.*sdk:[^0-9]*\([0-9][0-9]*\)\.\([0-9][0-9]*\).*/\1.\2/'
}

# The two libraries analysed from source are copied out, so that the package
# config can point "package:flutter_driver" at the copy while the installed tree
# stays untouched.
mkdir -p "$work/src" "$work/.dart_tool"
for p in flutter_driver integration_test; do
	cp -a "$PKGROOT/$p" "$work/src/$p"
done

{
	printf '{"configVersion":2,"packages":['
	first=1
	add() {
		lv=$(langver "$1")
		[ -n "$lv" ] || return 0
		[ "$first" = 1 ] || printf ','
		first=0
		printf '{"name":"%s","rootUri":"%s","packageUri":"lib/","languageVersion":"%s"}' \
			"$1" "$2" "$lv"
	}
	for name in \
		flutter flutter_test flutter_web_plugins fuchsia_remote_debug_protocol \
		sky_engine characters collection material_color_utilities meta \
		vector_math webdriver vm_service matcher path file test_api \
		stack_trace async clock fake_async stream_channel boolean_selector \
		source_span term_glyph string_scanner; do
		[ -d "$PKGROOT/$name" ] || continue
		add "$name" "file://$PKGROOT/$name"
	done
	for name in flutter_driver integration_test; do
		add "$name" "file://$work/src/$name"
	done
	printf ']}\n'
} > "$work/.dart_tool/package_config.json"

mkdir -p "$work/framework"
cat > "$work/framework/main.dart" <<'DART'
import "package:flutter/material.dart";
import "package:flutter_web_plugins/flutter_web_plugins.dart";

void main() {
  setUrlStrategy(null);
  final app = MaterialApp(home: Text("hello"));
  print(app.runtimeType);
}
DART

status=0
cd "$work"
"$DART" analyze "$work/framework" || status=1
for p in flutter_driver integration_test; do
	"$DART" analyze "$work/src/$p" || status=1
done
exit "$status"
