summary_db_writer_test.cc revision 8f7903b4c3699bc9129fa89d299699b1dfde6145
18f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney/* Copyright 2017 The TensorFlow Authors. All Rights Reserved.
28f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
38f7903b4c3699bc9129fa89d299699b1dfde6145Justine TunneyLicensed under the Apache License, Version 2.0 (the "License");
48f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunneyyou may not use this file except in compliance with the License.
58f7903b4c3699bc9129fa89d299699b1dfde6145Justine TunneyYou may obtain a copy of the License at
68f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
78f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    http://www.apache.org/licenses/LICENSE-2.0
88f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
98f7903b4c3699bc9129fa89d299699b1dfde6145Justine TunneyUnless required by applicable law or agreed to in writing, software
108f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunneydistributed under the License is distributed on an "AS IS" BASIS,
118f7903b4c3699bc9129fa89d299699b1dfde6145Justine TunneyWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
128f7903b4c3699bc9129fa89d299699b1dfde6145Justine TunneySee the License for the specific language governing permissions and
138f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunneylimitations under the License.
148f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney==============================================================================*/
158f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney#include "tensorflow/contrib/tensorboard/db/summary_db_writer.h"
168f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
178f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney#include "tensorflow/core/lib/core/status_test_util.h"
188f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney#include "tensorflow/core/lib/db/sqlite.h"
198f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney#include "tensorflow/core/platform/env.h"
208f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney#include "tensorflow/core/platform/test.h"
218f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
228f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunneynamespace tensorflow {
238f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunneynamespace {
248f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
258f7903b4c3699bc9129fa89d299699b1dfde6145Justine TunneyTensor MakeScalarInt64(int64 x) {
268f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  Tensor t(DT_INT64, TensorShape({}));
278f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  t.scalar<int64>()() = x;
288f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  return t;
298f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney}
308f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
318f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunneyclass FakeClockEnv : public EnvWrapper {
328f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney public:
338f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  FakeClockEnv() : EnvWrapper(Env::Default()), current_millis_(0) {}
348f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  void AdvanceByMillis(const uint64 millis) { current_millis_ += millis; }
358f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  uint64 NowMicros() override { return current_millis_ * 1000; }
368f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  uint64 NowSeconds() override { return current_millis_ * 1000; }
378f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
388f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney private:
398f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  uint64 current_millis_;
408f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney};
418f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
428f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunneyclass SummaryDbWriterTest : public ::testing::Test {
438f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney protected:
448f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  void SetUp() override { db_ = Sqlite::Open("file::memory:").ValueOrDie(); }
458f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
468f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  void TearDown() override {
478f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    if (writer_ != nullptr) {
488f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney      writer_->Unref();
498f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney      writer_ = nullptr;
508f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    }
518f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  }
528f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
538f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  int64 QueryInt(const string& sql) {
548f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    SqliteStatement stmt = db_->Prepare(sql);
558f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    bool is_done;
568f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    Status s = stmt.Step(&is_done);
578f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    if (!s.ok() || is_done) {
588f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney      LOG(ERROR) << s << " due to " << sql;
598f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney      return -1;
608f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    }
618f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    return stmt.ColumnInt(0);
628f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  }
638f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
648f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  double QueryDouble(const string& sql) {
658f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    SqliteStatement stmt = db_->Prepare(sql);
668f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    bool is_done;
678f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    Status s = stmt.Step(&is_done);
688f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    if (!s.ok() || is_done) {
698f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney      LOG(ERROR) << s << " due to " << sql;
708f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney      return -1;
718f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    }
728f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    return stmt.ColumnDouble(0);
738f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  }
748f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
758f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  string QueryString(const string& sql) {
768f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    SqliteStatement stmt = db_->Prepare(sql);
778f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    bool is_done;
788f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    Status s = stmt.Step(&is_done);
798f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    if (!s.ok() || is_done) {
808f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney      LOG(ERROR) << s << " due to " << sql;
818f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney      return "MISSINGNO";
828f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    }
838f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    return stmt.ColumnString(0);
848f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  }
858f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
868f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  FakeClockEnv env_;
878f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  std::shared_ptr<Sqlite> db_;
888f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  SummaryWriterInterface* writer_ = nullptr;
898f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney};
908f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
918f7903b4c3699bc9129fa89d299699b1dfde6145Justine TunneyTEST_F(SummaryDbWriterTest, NothingWritten_NoRowsCreated) {
928f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  TF_ASSERT_OK(CreateSummaryDbWriter(db_, "mad-science", "train", "jart", &env_,
938f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney                                     &writer_));
948f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  TF_ASSERT_OK(writer_->Flush());
958f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  writer_->Unref();
968f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  writer_ = nullptr;
978f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ(0LL, QueryInt("SELECT COUNT(*) FROM Users"));
988f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ(0LL, QueryInt("SELECT COUNT(*) FROM Experiments"));
998f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ(0LL, QueryInt("SELECT COUNT(*) FROM Runs"));
1008f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ(0LL, QueryInt("SELECT COUNT(*) FROM Tags"));
1018f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ(0LL, QueryInt("SELECT COUNT(*) FROM Tensors"));
1028f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney}
1038f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
1048f7903b4c3699bc9129fa89d299699b1dfde6145Justine TunneyTEST_F(SummaryDbWriterTest, TensorsWritten_RowsGetInitialized) {
1058f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  TF_ASSERT_OK(CreateSummaryDbWriter(db_, "mad-science", "train", "jart", &env_,
1068f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney                                     &writer_));
1078f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  env_.AdvanceByMillis(23);
1088f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  TF_ASSERT_OK(writer_->WriteTensor(1, MakeScalarInt64(123LL), "taggy",
1098f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney                                    "this-is-metaaa"));
1108f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  env_.AdvanceByMillis(23);
1118f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  TF_ASSERT_OK(writer_->WriteTensor(2, MakeScalarInt64(314LL), "taggy", ""));
1128f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  TF_ASSERT_OK(writer_->Flush());
1138f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
1148f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  ASSERT_EQ(1LL, QueryInt("SELECT COUNT(*) FROM Users"));
1158f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  ASSERT_EQ(1LL, QueryInt("SELECT COUNT(*) FROM Experiments"));
1168f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  ASSERT_EQ(1LL, QueryInt("SELECT COUNT(*) FROM Runs"));
1178f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  ASSERT_EQ(1LL, QueryInt("SELECT COUNT(*) FROM Tags"));
1188f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  ASSERT_EQ(2LL, QueryInt("SELECT COUNT(*) FROM Tensors"));
1198f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
1208f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  int64 user_id = QueryInt("SELECT user_id FROM Users");
1218f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  int64 experiment_id = QueryInt("SELECT experiment_id FROM Experiments");
1228f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  int64 run_id = QueryInt("SELECT run_id FROM Runs");
1238f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  int64 tag_id = QueryInt("SELECT tag_id FROM Tags");
1248f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_LT(0LL, user_id);
1258f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_LT(0LL, experiment_id);
1268f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_LT(0LL, run_id);
1278f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_LT(0LL, tag_id);
1288f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
1298f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ("jart", QueryString("SELECT user_name FROM Users"));
1308f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ(0.023, QueryDouble("SELECT inserted_time FROM Users"));
1318f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
1328f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ(user_id, QueryInt("SELECT user_id FROM Experiments"));
1338f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ("mad-science",
1348f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney            QueryString("SELECT experiment_name FROM Experiments"));
1358f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ(0.023, QueryDouble("SELECT inserted_time FROM Experiments"));
1368f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
1378f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ(experiment_id, QueryInt("SELECT experiment_id FROM Runs"));
1388f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ("train", QueryString("SELECT run_name FROM Runs"));
1398f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ(0.023, QueryDouble("SELECT inserted_time FROM Runs"));
1408f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
1418f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ(run_id, QueryInt("SELECT run_id FROM Tags"));
1428f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ("taggy", QueryString("SELECT tag_name FROM Tags"));
1438f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ(0.023, QueryDouble("SELECT inserted_time FROM Tags"));
1448f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ("this-is-metaaa", QueryString("SELECT metadata FROM Tags"));
1458f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
1468f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ(tag_id, QueryInt("SELECT tag_id FROM Tensors WHERE step = 1"));
1478f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ(0.023,
1488f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney            QueryDouble("SELECT computed_time FROM Tensors WHERE step = 1"));
1498f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ("this-is-metaaa", QueryString("SELECT metadata FROM Tags"));
1508f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_FALSE(
1518f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney      QueryString("SELECT tensor FROM Tensors WHERE step = 1").empty());
1528f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
1538f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ(tag_id, QueryInt("SELECT tag_id FROM Tensors WHERE step = 2"));
1548f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ(0.046,
1558f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney            QueryDouble("SELECT computed_time FROM Tensors WHERE step = 2"));
1568f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ("this-is-metaaa", QueryString("SELECT metadata FROM Tags"));
1578f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_FALSE(
1588f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney      QueryString("SELECT tensor FROM Tensors WHERE step = 2").empty());
1598f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney}
1608f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
1618f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney}  // namespace
1628f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney}  // namespace tensorflow
163