Files
IKAR/tool/release_smoke.dart
T

49 lines
1.7 KiB
Dart

import 'dart:convert';
import 'dart:io';
import 'package:crypto/crypto.dart';
import '../lib/core/transport/ikar_network.dart';
Future<void> main() async {
final http = IkarNetwork.client();
try {
final base = Uri.parse('https://ikar.kusoft.xyz');
final response = await (await http.getUrl(
base.resolve('/api/apps/ikar/manifest'),
)).close();
if (response.statusCode != 200)
throw StateError('Release manifest unavailable');
final manifest = jsonDecode(await utf8.decodeStream(response));
if (manifest['app']['packageName'] != 'ru.ikar.app' ||
manifest['release']['version'] != '1.0.0+1')
throw StateError('Incorrect release identity');
final expected = (await File(
'artifacts/ikar-1.0.0+1.apk.sha256',
).readAsString()).split(' ').first;
if (manifest['release']['sha256'] != expected)
throw StateError('Manifest checksum mismatch');
final download = await (await http.getUrl(
base.resolve(manifest['release']['downloadPath']),
)).close();
if (download.statusCode != 200)
throw StateError('APK download unavailable');
final digest = await sha256.bind(download).first;
if (digest.toString() != expected)
throw StateError('Downloaded APK checksum mismatch');
final report = {
'passed': true,
'package': 'ru.ikar.app',
'version': '1.0.0+1',
'sha256': expected,
'tlsValidation': true,
'bytes': manifest['release']['packageSizeBytes'],
'timestamp': DateTime.now().toUtc().toIso8601String(),
};
await File(
'artifacts/release-verification.json',
).writeAsString(const JsonEncoder.withIndent(' ').convert(report));
stdout.writeln(jsonEncode(report));
} finally {
http.close(force: true);
}
}