// Copyright 2017 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.

#include <memory>
#include <string>
#include <vector>

#include "util/gcs/gcs_util.h"

#include "glog/logging.h"
#include "third_party/googletest/googletest/include/gtest/gtest.h"

namespace cobalt {
namespace util {
namespace gcs {

// The guts of this test have been commented out so that on our CI and CQ
// bots all we are doing is testing that GcsUtil compiles. A developer may
// uncomment the guts of the test and replace the three string tokens:
//
// <cobalt_root_dir>
// <path to some service account key file>
// <put real bucket name here>
//
// appropriately in order to test uploading. Since GcsUtil is a very thin
// wrapper around google-api-cpp-client there is almost nothing we could
// mock out for a unit test.
TEST(GcUtilTest, SmokeTest) {
  GcsUtil gcs_util;
  /*
  setenv("GRPC_DEFAULT_SSL_ROOTS_FILE_PATH",
         "<cobalt_root_dir>/third_party/grpc/etc/roots.pem", 1);
  setenv("COBALT_GCS_SERVICE_ACCOUNT_CREDENTIALS",
         "<path to some service account key file>",
         1);
  ASSERT_TRUE(gcs_util.InitFromDefaultPaths());

  // Start with a ping.
  std::string bucket_name = "<put real bucket name here>";
  ASSERT_TRUE(gcs_util.Ping(bucket_name));

  // Upload using the string method.
  std::string data(
      "It is a far, far better thing that I do, than I have ever done;");
  ASSERT_TRUE(gcs_util.Upload(bucket_name, "tale2citiesA", "text/plain",
                              data.data(), data.size()));

  // Upload using the stream method.
  std::istringstream stream(
      "it is a far, far better rest that I go to than I have ever known.");
  ASSERT_TRUE(
      gcs_util.Upload(bucket_name, "tale2citiesB", "text/plain", &stream));

  // More pings.
  ASSERT_TRUE(gcs_util.Ping(bucket_name));
  ASSERT_TRUE(gcs_util.Ping(bucket_name));
  */
}

}  // namespace gcs
}  // namespace util
}  // namespace cobalt
