// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'dart:typed_data';

import 'package:path/path.dart' as path;
import 'package:expect/expect.dart';

import 'snapshot_test_helper.dart';

// Keep in sync with pkg/kernel/lib/binary/tag.dart:
const tagComponentFile = [0x90, 0xAB, 0xCD, 0xEF];
const tagBinaryFormatVersion = [0x00, 0x00, 0x00, 43];

Future<void> main(List<String> args) async {
  if (args.length == 1 && args[0] == '--child') {
    print('Hello, SDK Hash!');
    return;
  }

  final String sourcePath =
      path.join('runtime', 'tests', 'vm', 'dart_2', 'sdk_hash_test.dart');

  await withTempDir((String tmp) async {
    final String dillPath = path.join(tmp, 'test.dill');

    {
      final result = await Process.run(dart, [
        genKernel,
        '--platform',
        platformDill,
        '-o',
        dillPath,
        sourcePath,
      ]);
      Expect.equals('', result.stderr);
      Expect.equals(0, result.exitCode);
      Expect.equals('', result.stdout);
    }

    {
      final result = await Process.run(dart, [dillPath, '--child']);
      Expect.equals('', result.stderr);
      Expect.equals(0, result.exitCode);
      Expect.equals('Hello, SDK Hash!', result.stdout.trim());
    }

    // Invalidate the SDK hash in the kernel dill:
    {
      final myFile = File(dillPath);
      Uint8List bytes = myFile.readAsBytesSync();
      // The SDK Hash is located after the ComponentFile and BinaryFormatVersion
      // tags (both UInt32).
      Expect.listEquals(tagComponentFile, bytes.sublist(0, 4));
      Expect.listEquals(tagBinaryFormatVersion, bytes.sublist(4, 8));
      // Flip the first byte in the hash:
      bytes[8] ^= bytes[8];
      myFile.writeAsBytesSync(bytes);
    }

    {
      final result = await Process.run(dart, [dillPath, '--child']);
      Expect.equals(
          'Can\'t load Kernel binary: Invalid SDK hash.', result.stderr.trim());
      Expect.equals(253, result.exitCode);
      Expect.equals('', result.stdout);
    }

    // Zero out the SDK hash in the kernel dill to disable the check:
    {
      final myFile = File(dillPath);
      Uint8List bytes = myFile.readAsBytesSync();
      bytes.setRange(8, 18, ascii.encode('0000000000'));
      myFile.writeAsBytesSync(bytes);
    }

    {
      final result = await Process.run(dart, [dillPath, '--child']);
      Expect.equals('', result.stderr);
      Expect.equals(0, result.exitCode);
      Expect.equals('Hello, SDK Hash!', result.stdout.trim());
    }
  });
}
