# Copyright 2021 The Cobalt Authors. All Rights Reserved.
#
# 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
#
#     http://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.

static_library("storage_constants") {
  sources = [
    "storage_constants.cc",
    "storage_constants.h",
  ]
}

static_library("storage") {
  sources = [
    "savegame.cc",
    "savegame.h",
    "savegame_fake.cc",
    "savegame_starboard.cc",
    "savegame_thread.cc",
    "savegame_thread.h",
    "storage_manager.cc",
    "storage_manager.h",
  ]

  deps = [
    "//base",
    "//base:i18n",
    "//cobalt/base",
    "//cobalt/storage/store:memory_store",
    "//net",
    "//starboard/common",
    "//url",
  ]
}

target(gtest_target_type, "storage_test") {
  testonly = true
  sources = [
    "savegame_test.cc",
    "storage_manager_test.cc",
  ]

  defines = [ "GMOCK_NO_MOVE_MOCK" ]

  deps = [
    ":storage",
    "//cobalt/base",
    "//cobalt/test:run_all_unittests",
    "//net",
    "//testing/gmock",
    "//testing/gtest",
    "//url",
  ]
}
