# Copyright 2020 The Pigweed Authors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.

import("//build_overrides/pigweed.gni")

import("$dir_pw_bloat/bloat.gni")
import("$dir_pw_build/target_types.gni")
import("$dir_pw_docgen/docs.gni")
import("$dir_pw_sync/backend.gni")
import("$dir_pw_unit_test/test.gni")

config("public_include_path") {
  include_dirs = [ "public" ]
  visibility = [ ":*" ]
}

pw_source_set("pw_blob_store") {
  public_configs = [ ":public_include_path" ]
  public = [
    "public/pw_blob_store/blob_store.h",
    "public/pw_blob_store/internal/metadata_format.h",
  ]
  sources = [ "blob_store.cc" ]
  public_deps = [
    "$dir_pw_sync:borrow",
    dir_pw_bytes,
    dir_pw_kvs,
    dir_pw_preprocessor,
    dir_pw_status,
    dir_pw_stream,
  ]
  deps = [
    dir_pw_assert,
    dir_pw_checksum,
    dir_pw_log,
  ]
}

pw_source_set("flat_file_system_entry") {
  public_configs = [ ":public_include_path" ]
  public_deps = [
    ":pw_blob_store",
    "$dir_pw_file:flat_file_system",
    "$dir_pw_sync:lock_annotations",
    "$dir_pw_sync:virtual_basic_lockable",
    dir_pw_status,
  ]
  public = [ "public/pw_blob_store/flat_file_system_entry.h" ]
  sources = [ "flat_file_system_entry.cc" ]
  deps = [ dir_pw_assert ]
}

pw_test_group("tests") {
  tests = [
    ":blob_store_test_1_alignment",
    ":blob_store_test_16_alignment",
    ":blob_store_deferred_write_test",
    ":blob_store_chunk_write_test",
    ":flat_file_system_entry_test",
  ]
}

pw_test("blob_store_test_1_alignment") {
  deps = [
    ":pw_blob_store",
    "$dir_pw_kvs:crc16",
    "$dir_pw_kvs:fake_flash",
    "$dir_pw_kvs:fake_flash_test_key_value_store",
    "$dir_pw_sync:borrow",
    dir_pw_log,
    dir_pw_random,
  ]
  sources = [ "blob_store_test.cc" ]
}

pw_test("blob_store_test_16_alignment") {
  deps = [
    ":pw_blob_store",
    "$dir_pw_kvs:crc16",
    "$dir_pw_kvs:fake_flash",
    "$dir_pw_kvs:fake_flash_test_key_value_store",
    "$dir_pw_sync:borrow",
    dir_pw_log,
    dir_pw_random,
  ]
  sources = [ "blob_store_test.cc" ]
  defines = [ "PW_FLASH_TEST_ALIGNMENT=16U" ]
}

pw_test("blob_store_chunk_write_test") {
  deps = [
    ":pw_blob_store",
    "$dir_pw_kvs:crc16",
    "$dir_pw_kvs:fake_flash",
    "$dir_pw_kvs:fake_flash_test_key_value_store",
    dir_pw_log,
    dir_pw_random,
  ]
  sources = [ "blob_store_chunk_write_test.cc" ]
}

pw_test("blob_store_deferred_write_test") {
  deps = [
    ":pw_blob_store",
    "$dir_pw_kvs:crc16",
    "$dir_pw_kvs:fake_flash",
    "$dir_pw_kvs:fake_flash_test_key_value_store",
    dir_pw_log,
    dir_pw_random,
  ]
  sources = [ "blob_store_deferred_write_test.cc" ]
}

pw_test("flat_file_system_entry_test") {
  enable_if = pw_sync_MUTEX_BACKEND != ""
  deps = [
    ":flat_file_system_entry",
    ":pw_blob_store",
    "$dir_pw_kvs:crc16",
    "$dir_pw_kvs:fake_flash",
    "$dir_pw_kvs:fake_flash_test_key_value_store",
    "$dir_pw_sync:mutex",
    dir_pw_random,
  ]
  sources = [ "flat_file_system_entry_test.cc" ]
}

pw_doc_group("docs") {
  sources = [ "docs.rst" ]
  report_deps = [ ":blob_size" ]
}

pw_size_report("blob_size") {
  title = "Pigweed BlobStore size report"

  # To see all the symbols, uncomment the following:
  # Note: The size report RST table won't be generated when full_report = true.
  # full_report = true

  binaries = [
    {
      target = "size_report:basic_blob"
      base = "size_report:base"
      label = "BlobStore"
    },
  ]

  binaries += [
    {
      target = "size_report:deferred_write_blob"
      base = "size_report:base"
      label = "BlobStore with deferred write"
    },
  ]
}
