// Copyright (c) 2019, 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.

// ignore_for_file: lines_longer_than_80_chars

import 'dart:async';
import 'dart:convert';

import 'package:crypto/crypto.dart';
import 'package:test/test.dart';

void main() {
  group('SHA2-384', () {
    group('with a chunked converter', () {
      test('add may not be called after close', () {
        var sink = sha384.startChunkedConversion(
          StreamController<Digest>().sink,
        );
        sink.close();
        expect(() => sink.add([0]), throwsStateError);
      });

      test('close may be called multiple times', () {
        var sink = sha384.startChunkedConversion(
          StreamController<Digest>().sink,
        );
        sink.close();
        sink.close();
        sink.close();
        sink.close();
      });

      test('close closes the underlying sink', () {
        var inner = ChunkedConversionSink<Digest>.withCallback(
          expectAsync1((accumulated) {
            expect(accumulated.length, equals(1));
            expect(
              accumulated.first.toString(),
              equals(
                '38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b',
              ),
            );
          }),
        );

        var outer = sha384.startChunkedConversion(inner);
        outer.close();
      });
    });
  });

  group('SHA2-512', () {
    group('with a chunked converter', () {
      test('add may not be called after close', () {
        var sink = sha512.startChunkedConversion(
          StreamController<Digest>().sink,
        );
        sink.close();
        expect(() => sink.add([0]), throwsStateError);
      });

      test('close may be called multiple times', () {
        var sink = sha512.startChunkedConversion(
          StreamController<Digest>().sink,
        );
        sink.close();
        sink.close();
        sink.close();
        sink.close();
      });

      test('close closes the underlying sink', () {
        var inner = ChunkedConversionSink<Digest>.withCallback(
          expectAsync1((accumulated) {
            expect(accumulated.length, equals(1));
            expect(
              accumulated.first.toString(),
              equals(
                'cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e',
              ),
            );
          }),
        );

        var outer = sha512.startChunkedConversion(inner);
        outer.close();
      });
    });

    test('128 bit padding', () {
      final salts = [
        'AAAA{3FXhiiyc5gGWlRrVQ2RlJ.6xj.DKvf6l0bJxqh0BzA}'.codeUnits,
        'AAAA{3FXhiiyc5gGWlRrVQ.2RlJ6xj.DKvf6l0bJxqh0BzA}'.codeUnits,
        'AAAA{rFXhiiyc5gGWlVQ.2RlJ6xj.DKvf6lFXhiiyc5gGWl0}'.codeUnits,
      ];

      const results = [
        'nYg7eEsF/P7/l1AO0w8JFNNomS1gC76VE7Eg7Dpet+Dh6XiScDntYEU4tVItXp67evaLFvtMpW2uVJBZVKrBPw==',
        'TXNM4uk1Iwr2cYisWSdFifXdjfNiJTGEmNaMtqYrwJoS3JXpL1rebPKPfKudbFQGpcgJkLLhhpfnLzULBqq8KA==',
        'ckPYMDuPJjc73qHXQZiJgCskNG8mj9cPqFNsqYqxcBbQESgkWChoibAN7ssJrnoMFIpz9HwsBwMtt3z/KDUh9w==',
      ];

      for (var i = 0; i < salts.length; i++) {
        var digest = <int>[];
        for (var run = 0; run < 2000; run++) {
          digest = sha512.convert([...digest, ...salts[i]]).bytes;
        }
        expect(base64.encode(digest), results[i]);
      }
    });
  });
}
