// Copyright (c) 2015, 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:developer';
import 'dart:io' as io;
import 'package:observatory/service_io.dart';
import 'package:unittest/unittest.dart';
import 'test_helper.dart';

Future setupFiles() async {
  var dir = await io.Directory.systemTemp.createTemp('file_service');
  var writingFile;
  var readingFile;

  void closeDown() {
    if (writingFile != null) {
      writingFile.closeSync();
    }
    if (readingFile != null) {
      readingFile.closeSync();
    }
    dir.deleteSync(recursive: true);
  }

  Future<ServiceExtensionResponse> cleanup(ignored_a, ignored_b) {
    closeDown();
    var result = JSON.encode({'type' : 'foobar'});
    return new Future.value(new ServiceExtensionResponse.result(result));
  }

  Future<ServiceExtensionResponse> setup(ignored_a, ignored_b) async {
    try {
      var filePath = dir.path + io.Platform.pathSeparator + "file";
      var f = new io.File(filePath);
      writingFile = await f.open(mode: io.FileMode.WRITE);
      await writingFile.writeByte(42);
      await writingFile.writeByte(42);
      await writingFile.writeByte(42);

      var file = new io.File.fromUri(io.Platform.script);
      readingFile = await file.open();
      await readingFile.readByte();
      await readingFile.readByte();
      await readingFile.readByte();
      await readingFile.readByte();
      await readingFile.readByte();

      // The utility functions should close the files after them, so we
      // don't expect the calls below to result in open files.
      var writeTemp = dir.path + io.Platform.pathSeparator + "other_file";
      var utilFile = new io.File(writeTemp);
      await utilFile.writeAsString('foobar');
      var readTemp = new io.File(writeTemp);
      var result = await readTemp.readAsString();
      expect(result, equals('foobar'));

    } catch (e) {
      closeDown();
      throw e;
    }
    var result = JSON.encode({'type' : 'foobar'});
    return new Future.value(new ServiceExtensionResponse.result(result));
  }
  registerExtension('ext.dart.io.cleanup', cleanup);
  registerExtension('ext.dart.io.setup', setup);
}

var fileTests = [
  (Isolate isolate) async {
    await isolate.invokeRpcNoUpgrade('ext.dart.io.setup', {});
    try {
      var result =
          await isolate.invokeRpcNoUpgrade('ext.dart.io.getOpenFiles', {});
      expect(result['type'], equals('_openfiles'));

      expect(result['data'].length, equals(2));
      var writing = await isolate.invokeRpcNoUpgrade(
           'ext.dart.io.getFileByID', { 'id' : result['data'][0]['id'] });

      expect(writing['totalRead'], equals(0));
      expect(writing['readCount'], equals(0));
      expect(writing['writeCount'], equals(3));
      expect(writing['totalWritten'], equals(3));
      expect(writing['lastWrite'], greaterThan(0));
      expect(writing['lastRead'], equals(0));

      var reading = await isolate.invokeRpcNoUpgrade(
          'ext.dart.io.getFileByID', { 'id' : result['data'][1]['id'] });

      expect(reading['totalRead'], equals(5));
      expect(reading['readCount'], equals(5));
      expect(reading['writeCount'], equals(0));
      expect(reading['totalWritten'], equals(0));
      expect(reading['lastWrite'], equals(0));
      expect(reading['lastRead'], greaterThan(0));

    } finally {
      await isolate.invokeRpcNoUpgrade('ext.dart.io.cleanup', {});
    }
  },
];

main(args) async => runIsolateTests(args, fileTests, testeeBefore:setupFiles);
