# Copyright 2016 The Chromium 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("//services/service_manager/public/cpp/service.gni")
import("//services/service_manager/public/service_manifest.gni")
import("//testing/test.gni")

static_library("lib") {
  sources = [
    "env_mojo.cc",
    "env_mojo.h",
    "leveldb_database_impl.cc",
    "leveldb_database_impl.h",
    "leveldb_mojo_proxy.cc",
    "leveldb_mojo_proxy.h",
    "leveldb_service_impl.cc",
    "leveldb_service_impl.h",
  ]

  public_deps = [
    "//components/filesystem/public/interfaces",
    "//components/leveldb/public/cpp",
    "//components/leveldb/public/interfaces",
  ]

  deps = [
    "//mojo/common",
    "//mojo/public/cpp/system",
    "//services/service_manager/public/cpp",
    "//third_party/leveldatabase",
  ]
}

service("leveldb") {
  sources = [
    "leveldb_app.cc",
    "leveldb_app.h",
    "main.cc",
  ]

  deps = [
    ":lib",
    "//components/leveldb/public/interfaces",
    "//mojo/common",
    "//mojo/public/cpp/bindings",
    "//mojo/public/cpp/system",
    "//services/service_manager/public/cpp",
    "//services/tracing/public/cpp",
  ]

  data_deps = [
    ":manifest",
  ]
}

service_manifest("manifest") {
  name = "leveldb"
  source = "manifest.json"
}

test("leveldb_service_unittests") {
  sources = [
    "leveldb_service_unittest.cc",
    "remote_iterator_unittest.cc",
  ]

  deps = [
    "//base",
    "//components/filesystem/public/interfaces",
    "//components/leveldb/public/cpp",
    "//components/leveldb/public/interfaces",
    "//mojo/common",
    "//mojo/public/cpp/bindings",
    "//mojo/public/cpp/system",
    "//services/service_manager/public/cpp:service_test_support",
    "//services/service_manager/public/cpp:sources",
    "//services/service_manager/public/cpp/test:run_all_service_tests",
    "//third_party/leveldatabase",
  ]

  data_deps = [
    ":test_manifest",
    ":leveldb",
    "//components/filesystem:filesystem",
  ]
}

service_manifest("test_manifest") {
  name = "leveldb_service_unittests"
  source = "test_manifest.json"
}
