# Copyright 2020 The Fuchsia 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("//build/go/go_binary.gni")
import("//build/go/go_library.gni")
import("//build/go/go_test.gni")
import("//build/testing/golden_file.gni")
import("//third_party/protobuf/proto_library.gni")

go_library("proto_lib") {
  source_dir = "proto"
  sources = [
    "context.pb.go",
    "static.pb.go",
  ]
  deps = [ "//third_party/golibs:github.com/golang/protobuf" ]
}

go_library("fint_lib") {
  sources = [
    "fint_test.go",
    "main.go",
    "parse.go",
    "set.go",
    "set_test.go",
  ]

  deps = [
    ":proto_lib",
    "//third_party/golibs:github.com/golang/protobuf",
    "//third_party/golibs:github.com/google/subcommands",
    "//tools/lib/color",
    "//tools/lib/command",
    "//tools/lib/logger",
    "//tools/lib/osmisc",
    "//tools/lib/runner",
  ]
}

go_binary("fint") {
  gopackage = "go.fuchsia.dev/fuchsia/tools/integration/cmd/fint"
  deps = [ ":fint_lib" ]
}

go_test("fint_tests") {
  gopackages = [ "go.fuchsia.dev/fuchsia/tools/integration/cmd/fint" ]
  deps = [ ":fint_lib" ]
}

proto_library("context") {
  sources = [ "proto/context.proto" ]
  generate_cc = false
  generate_go = true
  generate_python = false
}

proto_library("static") {
  sources = [ "proto/static.proto" ]
  generate_cc = false
  generate_descriptor_set = true
  generate_go = true
  generate_python = false
}

golden_file("context_pb_go_diff") {
  current = "${root_gen_dir}/go-proto-gen/src/tools/integration/cmd/fint/proto/context.pb.go"
  golden = "proto/context.pb.go"
  deps = [ ":context" ]
  warn_on_changes = false
}

golden_file("static_pb_go_diff") {
  current = "${root_gen_dir}/go-proto-gen/src/tools/integration/cmd/fint/proto/static.pb.go"
  golden = "proto/static.pb.go"
  deps = [ ":static" ]
  warn_on_changes = false
}

golden_file("static_desc_pb_diff") {
  current = "${target_out_dir}/static.desc.pb"
  golden = "proto/static.desc.pb"
  deps = [ ":static" ]
  warn_on_changes = false
}

group("tests") {
  testonly = true
  deps = [
    # The diff rules aren't really tests, but we want to ensure they're run in CQ.
    ":context_pb_go_diff",
    ":fint_tests",
    ":static_desc_pb_diff",
    ":static_pb_go_diff",
  ]
}
