// Copyright 2019 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:cocoon_service/src/model/ci_yaml/target.dart';
import 'package:cocoon_service/src/model/luci/buildbucket.dart';
import 'package:cocoon_service/src/model/proto/protos.dart' as pb;
import 'package:cocoon_service/src/service/scheduler/policy.dart';
import 'package:test/test.dart';

import '../../src/utilities/entity_generators.dart';

void main() {
  group('Target', () {
    group('properties', () {
      test('default properties', () {
        final Target target = generateTarget(1);
        expect(target.getProperties(), <String, Object>{
          'bringup': false,
          'dependencies': <String>[],
        });
      });

      test('properties with ignore_flakiness true', () {
        final Target target = generateTarget(
          1,
          platform: 'Mac_ios',
          platformProperties: <String, String>{
            // This should be overrided by the target specific property
            'xcode': 'abc',
          },
          properties: <String, String>{
            'xcode': '12abc',
            'ignore_flakiness': 'true',
          },
        );
        expect(target.getIgnoreFlakiness(), true);
      });

      test('properties with ignore_flakiness not present', () {
        final Target target = generateTarget(
          1,
          platform: 'Mac_ios',
          platformProperties: <String, String>{
            // This should be overrided by the target specific property
            'xcode': 'abc',
          },
          properties: <String, String>{
            'xcode': '12abc',
          },
        );
        expect(target.getIgnoreFlakiness(), false);
      });

      test('properties with ignore_flakiness in platform properties', () {
        final Target target = generateTarget(
          1,
          platform: 'Mac_ios',
          platformProperties: <String, String>{
            // This should be overrided by the target specific property
            'ignore_flakiness': 'true',
          },
          properties: <String, String>{
            'xcode': '12abc',
          },
        );
        expect(target.getIgnoreFlakiness(), true);
      });

      test('properties with ignore_flakiness overrides platform properties', () {
        final Target target = generateTarget(
          1,
          platform: 'Mac_ios',
          platformProperties: <String, String>{
            // This should be overrided by the target specific property
            'ignore_flakiness': 'true',
          },
          properties: <String, String>{
            'xcode': '12abc',
            'ignore_flakiness': 'false',
          },
        );
        expect(target.getIgnoreFlakiness(), false);
      });

      test('properties with xcode overrides platform properties', () {
        final Target target = generateTarget(
          1,
          platform: 'Mac_ios',
          platformProperties: <String, String>{
            // This should be overrided by the target specific property
            'xcode': 'abc',
          },
          properties: <String, String>{
            'xcode': '12abc',
          },
        );
        expect(target.getProperties(), <String, Object>{
          'bringup': false,
          'dependencies': <String>[],
          '\$flutter/devicelab_osx_sdk': <String, Object>{
            'sdk_version': '12abc',
          },
          'xcode': '12abc',
        });
      });

      test('tags are parsed from within properties', () {
        final Target target = generateTarget(
          1,
          platform: 'Linux_build_test',
          platformProperties: <String, String>{
            // This should be overrided by the target specific property
            'android_sdk': 'abc',
          },
          properties: <String, String>{'xcode': '12abc', 'tags': '["devicelab", "android", "linux"]'},
        );
        expect(target.tags, ['devicelab', 'android', 'linux']);
      });

      test('we do not blow up if tags are not present', () {
        final Target target = generateTarget(
          1,
          platform: 'Linux_build_test',
          platformProperties: <String, String>{
            // This should be overrided by the target specific property
            'android_sdk': 'abc',
          },
          properties: <String, String>{
            'xcode': '12abc',
          },
        );
        expect(target.tags, []);
      });

      test('platform properties with xcode', () {
        final Target target = generateTarget(
          1,
          platform: 'Mac_ios',
          platformProperties: <String, String>{
            'xcode': '12abc',
          },
        );
        expect(target.getProperties(), <String, Object>{
          'bringup': false,
          'dependencies': <String>[],
          '\$flutter/devicelab_osx_sdk': <String, Object>{
            'sdk_version': '12abc',
          },
          'xcode': '12abc',
        });
      });

      test('platform properties with runtime_versions', () {
        final Target target = generateTarget(
          1,
          platform: 'Mac',
          platformProperties: <String, String>{
            'runtime_versions': '["ios-13-0", "ios-15-0"]',
          },
        );
        expect(target.getProperties(), <String, Object>{
          'bringup': false,
          'dependencies': <String>[],
          '\$flutter/osx_sdk': <String, Object>{
            'runtime_versions': ['ios-13-0', 'ios-15-0'],
          },
          'runtime_versions': ['ios-13-0', 'ios-15-0'],
        });
      });

      test('properties with runtime_versions overrides platform properties', () {
        final Target target = generateTarget(
          1,
          platform: 'Mac',
          platformProperties: <String, String>{
            // This should be overrided by the target specific property
            'runtime_versions': '["ios-13-0", "ios-15-0"]',
          },
          properties: <String, String>{
            'runtime_versions': '["ios-13-0", "ios-15-0"]',
          },
        );
        expect(target.getProperties(), <String, Object>{
          'bringup': false,
          'dependencies': <String>[],
          '\$flutter/osx_sdk': <String, Object>{
            'runtime_versions': ['ios-13-0', 'ios-15-0'],
          },
          'runtime_versions': ['ios-13-0', 'ios-15-0'],
        });
      });

      test('platform properties with xcode and runtime_versions', () {
        final Target target = generateTarget(
          1,
          platform: 'Mac',
          platformProperties: <String, String>{
            'xcode': '12abc',
            'runtime_versions': '["ios-13-0", "ios-15-0"]',
          },
        );
        expect(target.getProperties(), <String, Object>{
          'bringup': false,
          'dependencies': <String>[],
          '\$flutter/osx_sdk': <String, Object>{
            'runtime_versions': ['ios-13-0', 'ios-15-0'],
            'sdk_version': '12abc',
          },
          'xcode': '12abc',
          'runtime_versions': ['ios-13-0', 'ios-15-0'],
        });
      });

      test('platform properties with xcode and runtime_versions on Mac_ios', () {
        final Target target = generateTarget(
          1,
          platform: 'Mac_ios',
          platformProperties: <String, String>{
            'xcode': '12abc',
            'runtime_versions': '["ios-13-0", "ios-15-0"]',
          },
        );
        expect(target.getProperties(), <String, Object>{
          'bringup': false,
          'dependencies': <String>[],
          '\$flutter/osx_sdk': <String, Object>{
            'runtime_versions': ['ios-13-0', 'ios-15-0'],
          },
          '\$flutter/devicelab_osx_sdk': <String, Object>{
            'sdk_version': '12abc',
          },
          'xcode': '12abc',
          'runtime_versions': ['ios-13-0', 'ios-15-0'],
        });
      });

      test('properties with xcode and runtime_versions overrides platform properties', () {
        final Target target = generateTarget(
          1,
          platform: 'Mac',
          platformProperties: <String, String>{
            // This should be overrided by the target specific property
            'xcode': 'abc',
            'runtime_versions': '["ios-17-0"]',
          },
          properties: <String, String>{
            'xcode': '12abc',
            'runtime_versions': '["ios-13-0", "ios-15-0"]',
          },
        );
        expect(target.getProperties(), <String, Object>{
          'bringup': false,
          'dependencies': <String>[],
          '\$flutter/osx_sdk': <String, Object>{
            'runtime_versions': ['ios-13-0', 'ios-15-0'],
            'sdk_version': '12abc',
          },
          'xcode': '12abc',
          'runtime_versions': ['ios-13-0', 'ios-15-0'],
        });
      });
    });

    group('dimensions', () {
      test('no dimensions', () {
        final Target target = generateTarget(1);
        expect(target.getDimensions().length, 0);
      });

      test('platform dimensions and target dimensions are combined', () {
        final Target target = generateTarget(
          1,
          platform: 'Mac_ios',
          platformDimensions: <String, String>{
            'signing_cert': 'none',
          },
          properties: <String, String>{'os': 'abc', 'cpu': 'x64'},
        );
        final List<RequestedDimension> dimensions = target.getDimensions();
        expect(dimensions.length, 3);
        expect(dimensions[0].key, 'signing_cert');
        expect(dimensions[0].value, 'none');
        expect(dimensions[1].key, 'os');
        expect(dimensions[1].value, 'abc');
        expect(dimensions[2].key, 'cpu');
        expect(dimensions[2].value, 'x64');
      });

      test('target specific dimensions overrides platform dimensions', () {
        final Target target = generateTarget(
          1,
          platform: 'Mac_ios',
          platformDimensions: <String, String>{
            'signing_cert': 'none',
          },
          dimensions: <String, String>{'signing_cert': 'mac'},
        );
        final List<RequestedDimension> dimensions = target.getDimensions();
        expect(dimensions.length, 1);
        expect(dimensions[0].key, 'signing_cert');
        expect(dimensions[0].value, 'mac');
      });

      test('target specific dimensions overrides legacy target specific properties', () {
        final Target target = generateTarget(
          1,
          platform: 'Windows',
          dimensions: <String, String>{'cpu': 'x64'},
          properties: <String, String>{'cpu': 'x32'},
        );
        final List<RequestedDimension> dimensions = target.getDimensions();
        expect(dimensions.length, 1);
        expect(dimensions[0].key, 'cpu');
        expect(dimensions[0].value, 'x64');
      });

      test('target specific dimensions overrides legacy platform properties', () {
        final Target target = generateTarget(
          1,
          platform: 'Windows',
          dimensions: <String, String>{'cpu': 'x64'},
          platformProperties: <String, String>{'cpu': 'x32'},
        );
        final List<RequestedDimension> dimensions = target.getDimensions();
        expect(dimensions.length, 1);
        expect(dimensions[0].key, 'cpu');
        expect(dimensions[0].value, 'x64');
      });

      test('properties are evaluated as string', () {
        final Target target = generateTarget(
          1,
          platform: 'Mac_ios',
          platformDimensions: <String, String>{
            'signing_cert': 'none',
          },
          properties: <String, String>{"cores": "32"},
        );
        expect(target.getDimensions().length, 2);
      });
    });

    group('scheduler policy', () {
      test('devicelab targets use batch policy', () {
        expect(generateTarget(1, platform: 'Linux_android').schedulerPolicy, isA<BatchPolicy>());
      });

      test('devicelab samsung targets use batch policy', () {
        expect(generateTarget(1, platform: 'Linux_samsung_a02').schedulerPolicy, isA<BatchPolicy>());
      });

      test('mac host only targets use batch policy', () {
        expect(generateTarget(1, platform: 'Mac').schedulerPolicy, isA<BatchPolicy>());
      });

      test('non-cocoon scheduler targets return omit policy', () {
        expect(generateTarget(1, platform: 'Linux_android', schedulerSystem: pb.SchedulerSystem.luci).schedulerPolicy,
            isA<OmitPolicy>());
      });

      test('vm cocoon targets return batch policy', () {
        expect(generateTarget(1, platform: 'Linux').schedulerPolicy, isA<BatchPolicy>());
      });
    });
  });
}
