# Copyright 2017 The Fuchsia 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
#
#    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.

declare_proto_files_are_generated()

# Generate the C++ bindings for the ReportMaster gRPC service.
# Also compile the generated C++ files into a static library.
cobalt_make_protobuf_cpp_lib(report_master_proto_lib
    REPORT_PROTO_HDRS
    true
    report_master report_internal)

# Generate the Go bindings for ReportMaster gRPC service.
cobalt_protobuf_generate_go(generate_report_master_pb_go_files
                            REPORT_MASTER_PB_GO_FILES
                            true
                            report_master)
add_dependencies(generate_report_master_pb_go_files
                 generate_config_pb_go_files
                 generate_cobalt_pb_go_files)

# Generate the descriptor set to configure cloud endpoints for the ReportMaster service.
cobalt_generate_protobuf_descriptors(generate_report_master_descriptor
                                     REPORT_MASTER_PROTO_DESCRIPTOR
                                     report_master)

# Build the ReportMaster library
add_library(analyzer_report_master_lib
            auth_enforcer.cc
            histogram_analysis_engine.cc
            raw_dump_reports.cc
            report_executor.cc
            report_exporter.cc
            report_generator.cc
            report_history_cache.cc
            report_master_service.cc
            report_row_iterator.cc
            report_scheduler.cc
            report_serializer.cc
            report_stream.cc
            ${COBALT_PROTO_HDRS} ${CONFIG_PROTO_HDRS} ${REPORT_PROTO_HDRS} )
target_link_libraries(analyzer_report_master_lib
                      analyzer_config
                      analyzer_store
                      buckets_config
                      cobalt_crypto
                      gcs_util
                      pem_util
                      forculus_analyzer
                      rappor_analyzer
                      report_master_proto_lib
                      rapidjson)
add_cobalt_dependencies(analyzer_report_master_lib)

# Build the Report Master executable
add_executable(analyzer_report_master main.cc)
target_link_libraries(analyzer_report_master
                      analyzer_report_master_lib)
add_cobalt_dependencies(analyzer_report_master)

# Build the tests
add_executable(analyzer_report_master_tests
               ${CMAKE_SOURCE_DIR}/analyzer/store/memory_store.cc
               auth_enforcer_test.cc
               histogram_analysis_engine_test.cc
               raw_dump_reports_test.cc
               report_executor_test.cc
               report_exporter_test.cc
               report_generator_test.cc
               report_history_cache_test.cc
               report_row_iterator_test.cc
               report_scheduler_test.cc
               report_master_service_test.cc
               report_serializer_test.cc
               report_stream_test.cc)
target_link_libraries(analyzer_report_master_tests
                      analyzer_report_master_lib
                      encoder
                      report_store_testutils)
add_cobalt_test_dependencies(analyzer_report_master_tests ${DIR_GTESTS})

# Versions of our tests that expect the existence of a running local instance of
# the Bigtable Emulator process.
add_executable(analyzer_report_master_emulator_tests
               report_executor_emulator_test.cc
               report_generator_emulator_test.cc
               report_master_service_emulator_test.cc)
target_link_libraries(analyzer_report_master_emulator_tests
                      analyzer_report_master_lib
                      encoder
                      report_store_testutils)
add_cobalt_test_dependencies(analyzer_report_master_emulator_tests ${DIR_GTESTS_BT_EMULATOR})

# Versions of our tests that connect to the real Cloud Bigtable. See
# notes in bigtabe_cloud_helper.h for how this works.
add_executable(analyzer_report_master_cloud_tests
               report_executor_cloud_test.cc
               report_generator_cloud_test.cc
               report_master_service_cloud_test.cc)
target_link_libraries(analyzer_report_master_cloud_tests
                      analyzer_report_master_lib
                      encoder
                      report_store_testutils)
add_cobalt_test_dependencies(analyzer_report_master_cloud_tests ${DIR_GTESTS_CLOUD_BT})
