summary_db_writer_test.cc revision 6c4af6202c3984d7eabc8044c43579315c4b07a2
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
176fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney#include "tensorflow/core/framework/graph.pb.h"
186fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney#include "tensorflow/core/framework/node_def.pb.h"
1935cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney#include "tensorflow/core/framework/summary.pb.h"
208f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney#include "tensorflow/core/lib/core/status_test_util.h"
218f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney#include "tensorflow/core/lib/db/sqlite.h"
2235cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney#include "tensorflow/core/lib/strings/strcat.h"
238f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney#include "tensorflow/core/platform/env.h"
248f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney#include "tensorflow/core/platform/test.h"
2535cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney#include "tensorflow/core/util/event.pb.h"
268f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
278f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunneynamespace tensorflow {
288f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunneynamespace {
298f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
3035cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunneyconst float kTolerance = 1e-5;
3135cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney
328f7903b4c3699bc9129fa89d299699b1dfde6145Justine TunneyTensor MakeScalarInt64(int64 x) {
338f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  Tensor t(DT_INT64, TensorShape({}));
348f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  t.scalar<int64>()() = x;
358f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  return t;
368f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney}
378f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
388f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunneyclass FakeClockEnv : public EnvWrapper {
398f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney public:
408f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  FakeClockEnv() : EnvWrapper(Env::Default()), current_millis_(0) {}
418f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  void AdvanceByMillis(const uint64 millis) { current_millis_ += millis; }
428f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  uint64 NowMicros() override { return current_millis_ * 1000; }
438f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  uint64 NowSeconds() override { return current_millis_ * 1000; }
448f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
458f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney private:
468f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  uint64 current_millis_;
478f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney};
488f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
498f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunneyclass SummaryDbWriterTest : public ::testing::Test {
508f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney protected:
5135cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  void SetUp() override { db_ = Sqlite::Open(":memory:").ValueOrDie(); }
528f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
538f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  void TearDown() override {
548f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    if (writer_ != nullptr) {
558f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney      writer_->Unref();
568f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney      writer_ = nullptr;
578f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    }
588f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  }
598f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
608f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  int64 QueryInt(const string& sql) {
618f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    SqliteStatement stmt = db_->Prepare(sql);
628f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    bool is_done;
638f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    Status s = stmt.Step(&is_done);
648f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    if (!s.ok() || is_done) {
658f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney      LOG(ERROR) << s << " due to " << sql;
668f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney      return -1;
678f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    }
688f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    return stmt.ColumnInt(0);
698f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  }
708f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
718f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  double QueryDouble(const string& sql) {
728f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    SqliteStatement stmt = db_->Prepare(sql);
738f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    bool is_done;
748f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    Status s = stmt.Step(&is_done);
758f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    if (!s.ok() || is_done) {
768f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney      LOG(ERROR) << s << " due to " << sql;
778f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney      return -1;
788f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    }
798f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    return stmt.ColumnDouble(0);
808f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  }
818f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
828f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  string QueryString(const string& sql) {
838f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    SqliteStatement stmt = db_->Prepare(sql);
848f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    bool is_done;
858f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    Status s = stmt.Step(&is_done);
868f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    if (!s.ok() || is_done) {
878f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney      LOG(ERROR) << s << " due to " << sql;
888f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney      return "MISSINGNO";
898f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    }
908f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    return stmt.ColumnString(0);
918f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  }
928f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
938f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  FakeClockEnv env_;
948f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  std::shared_ptr<Sqlite> db_;
958f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  SummaryWriterInterface* writer_ = nullptr;
968f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney};
978f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
988f7903b4c3699bc9129fa89d299699b1dfde6145Justine TunneyTEST_F(SummaryDbWriterTest, NothingWritten_NoRowsCreated) {
998f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  TF_ASSERT_OK(CreateSummaryDbWriter(db_, "mad-science", "train", "jart", &env_,
1008f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney                                     &writer_));
1018f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  TF_ASSERT_OK(writer_->Flush());
1028f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  writer_->Unref();
1038f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  writer_ = nullptr;
1046c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  EXPECT_EQ(0LL, QueryInt("SELECT COUNT(*) FROM Ids"));
1058f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ(0LL, QueryInt("SELECT COUNT(*) FROM Users"));
1068f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ(0LL, QueryInt("SELECT COUNT(*) FROM Experiments"));
1078f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ(0LL, QueryInt("SELECT COUNT(*) FROM Runs"));
1088f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ(0LL, QueryInt("SELECT COUNT(*) FROM Tags"));
1098f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ(0LL, QueryInt("SELECT COUNT(*) FROM Tensors"));
1108f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney}
1118f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
1128f7903b4c3699bc9129fa89d299699b1dfde6145Justine TunneyTEST_F(SummaryDbWriterTest, TensorsWritten_RowsGetInitialized) {
1136c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  SummaryMetadata metadata;
1146c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  metadata.set_display_name("display_name");
1156c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  metadata.set_summary_description("description");
1166c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  metadata.mutable_plugin_data()->set_plugin_name("plugin_name");
1176c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  metadata.mutable_plugin_data()->set_content("plugin_data");
1186c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  SummaryMetadata metadata_nope;
1196c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  metadata_nope.set_display_name("nope");
1206c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  metadata_nope.set_summary_description("nope");
1216c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  metadata_nope.mutable_plugin_data()->set_plugin_name("nope");
1226c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  metadata_nope.mutable_plugin_data()->set_content("nope");
1238f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  TF_ASSERT_OK(CreateSummaryDbWriter(db_, "mad-science", "train", "jart", &env_,
1248f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney                                     &writer_));
1258f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  env_.AdvanceByMillis(23);
1268f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  TF_ASSERT_OK(writer_->WriteTensor(1, MakeScalarInt64(123LL), "taggy",
1276c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney                                    metadata.SerializeAsString()));
1288f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  env_.AdvanceByMillis(23);
1296c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  TF_ASSERT_OK(writer_->WriteTensor(2, MakeScalarInt64(314LL), "taggy",
1306c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney                                    metadata_nope.SerializeAsString()));
1318f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  TF_ASSERT_OK(writer_->Flush());
1328f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
1338f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  ASSERT_EQ(1LL, QueryInt("SELECT COUNT(*) FROM Users"));
1348f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  ASSERT_EQ(1LL, QueryInt("SELECT COUNT(*) FROM Experiments"));
1358f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  ASSERT_EQ(1LL, QueryInt("SELECT COUNT(*) FROM Runs"));
1368f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  ASSERT_EQ(1LL, QueryInt("SELECT COUNT(*) FROM Tags"));
1378f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  ASSERT_EQ(2LL, QueryInt("SELECT COUNT(*) FROM Tensors"));
1388f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
1398f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  int64 user_id = QueryInt("SELECT user_id FROM Users");
1408f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  int64 experiment_id = QueryInt("SELECT experiment_id FROM Experiments");
1418f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  int64 run_id = QueryInt("SELECT run_id FROM Runs");
1428f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  int64 tag_id = QueryInt("SELECT tag_id FROM Tags");
1438f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_LT(0LL, user_id);
1448f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_LT(0LL, experiment_id);
1458f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_LT(0LL, run_id);
1468f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_LT(0LL, tag_id);
1478f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
1488f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ("jart", QueryString("SELECT user_name FROM Users"));
1498f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ(0.023, QueryDouble("SELECT inserted_time FROM Users"));
1508f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
1518f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ(user_id, QueryInt("SELECT user_id FROM Experiments"));
1528f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ("mad-science",
1538f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney            QueryString("SELECT experiment_name FROM Experiments"));
1548f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ(0.023, QueryDouble("SELECT inserted_time FROM Experiments"));
1558f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
1568f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ(experiment_id, QueryInt("SELECT experiment_id FROM Runs"));
1578f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ("train", QueryString("SELECT run_name FROM Runs"));
1588f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ(0.023, QueryDouble("SELECT inserted_time FROM Runs"));
1598f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
1608f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ(run_id, QueryInt("SELECT run_id FROM Tags"));
1618f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ("taggy", QueryString("SELECT tag_name FROM Tags"));
1628f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ(0.023, QueryDouble("SELECT inserted_time FROM Tags"));
1636c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney
1646c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  EXPECT_EQ("display_name", QueryString("SELECT display_name FROM Tags"));
1656c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  EXPECT_EQ("plugin_name", QueryString("SELECT plugin_name FROM Tags"));
1666c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  EXPECT_EQ("plugin_data", QueryString("SELECT plugin_data FROM Tags"));
1676c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  EXPECT_EQ("description", QueryString("SELECT description FROM Descriptions"));
1688f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
1698f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ(tag_id, QueryInt("SELECT tag_id FROM Tensors WHERE step = 1"));
1708f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ(0.023,
1718f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney            QueryDouble("SELECT computed_time FROM Tensors WHERE step = 1"));
1728f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_FALSE(
1738f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney      QueryString("SELECT tensor FROM Tensors WHERE step = 1").empty());
1748f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
1758f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ(tag_id, QueryInt("SELECT tag_id FROM Tensors WHERE step = 2"));
1768f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ(0.046,
1778f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney            QueryDouble("SELECT computed_time FROM Tensors WHERE step = 2"));
1788f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_FALSE(
1798f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney      QueryString("SELECT tensor FROM Tensors WHERE step = 2").empty());
1808f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney}
1818f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
18235cc51dc2a716c4b92429db60238e4f15fba1ed3Justine TunneyTEST_F(SummaryDbWriterTest, EmptyParentNames_NoParentsCreated) {
18335cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  TF_ASSERT_OK(CreateSummaryDbWriter(db_, "", "", "", &env_, &writer_));
1846c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  TF_ASSERT_OK(writer_->WriteTensor(1, MakeScalarInt64(123LL), "taggy", ""));
18535cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  TF_ASSERT_OK(writer_->Flush());
18635cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  ASSERT_EQ(0LL, QueryInt("SELECT COUNT(*) FROM Users"));
18735cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  ASSERT_EQ(0LL, QueryInt("SELECT COUNT(*) FROM Experiments"));
18835cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  ASSERT_EQ(0LL, QueryInt("SELECT COUNT(*) FROM Runs"));
18935cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  ASSERT_EQ(1LL, QueryInt("SELECT COUNT(*) FROM Tags"));
19035cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  ASSERT_EQ(1LL, QueryInt("SELECT COUNT(*) FROM Tensors"));
19135cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney}
19235cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney
19335cc51dc2a716c4b92429db60238e4f15fba1ed3Justine TunneyTEST_F(SummaryDbWriterTest, WriteEvent_Scalar) {
19435cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  TF_ASSERT_OK(CreateSummaryDbWriter(db_, "", "", "", &env_, &writer_));
19535cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  std::unique_ptr<Event> e{new Event};
19635cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  e->set_step(7);
19735cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  e->set_wall_time(123.456);
19835cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  Summary::Value* s = e->mutable_summary()->add_value();
19935cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  s->set_tag("π");
20035cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  s->set_simple_value(3.14f);
20135cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  s = e->mutable_summary()->add_value();
20235cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  s->set_tag("φ");
20335cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  s->set_simple_value(1.61f);
20435cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  TF_ASSERT_OK(writer_->WriteEvent(std::move(e)));
20535cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  TF_ASSERT_OK(writer_->Flush());
20635cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  ASSERT_EQ(2LL, QueryInt("SELECT COUNT(*) FROM Tags"));
20735cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  ASSERT_EQ(2LL, QueryInt("SELECT COUNT(*) FROM Tensors"));
20835cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  int64 tag1_id = QueryInt("SELECT tag_id FROM Tags WHERE tag_name = 'π'");
20935cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  int64 tag2_id = QueryInt("SELECT tag_id FROM Tags WHERE tag_name = 'φ'");
21035cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  EXPECT_GT(tag1_id, 0LL);
21135cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  EXPECT_GT(tag2_id, 0LL);
21235cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  EXPECT_EQ(123.456, QueryDouble(strings::StrCat(
21335cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney                         "SELECT computed_time FROM Tensors WHERE tag_id = ",
21435cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney                         tag1_id, " AND step = 7")));
21535cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  EXPECT_EQ(123.456, QueryDouble(strings::StrCat(
21635cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney                         "SELECT computed_time FROM Tensors WHERE tag_id = ",
21735cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney                         tag2_id, " AND step = 7")));
21835cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  EXPECT_NEAR(3.14,
21935cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney              QueryDouble(strings::StrCat(
22035cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney                  "SELECT tensor FROM Tensors WHERE tag_id = ", tag1_id,
22135cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney                  " AND step = 7")),
22235cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney              kTolerance);  // Summary::simple_value is float
22335cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  EXPECT_NEAR(1.61,
22435cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney              QueryDouble(strings::StrCat(
22535cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney                  "SELECT tensor FROM Tensors WHERE tag_id = ", tag2_id,
22635cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney                  " AND step = 7")),
22735cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney              kTolerance);
22835cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney}
22935cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney
2306fb721d608c4cd3855fe8793099a629428b9853cJustine TunneyTEST_F(SummaryDbWriterTest, WriteGraph) {
2316fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  TF_ASSERT_OK(CreateSummaryDbWriter(db_, "", "R", "", &env_, &writer_));
2326fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  env_.AdvanceByMillis(23);
2336fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  GraphDef graph;
2346fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  NodeDef* node = graph.add_node();
2356fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  node->set_name("x");
2366fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  node->set_op("Placeholder");
2376fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  node = graph.add_node();
2386fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  node->set_name("y");
2396fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  node->set_op("Placeholder");
2406fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  node = graph.add_node();
2416fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  node->set_name("z");
2426fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  node->set_op("Love");
2436fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  node = graph.add_node();
2446fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  node->set_name("+");
2456fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  node->set_op("Add");
2466fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  node->add_input("x");
2476fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  node->add_input("y");
2486fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  node->add_input("^z");
2496fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  node->set_device("tpu/lol");
2506fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  std::unique_ptr<Event> e{new Event};
2516fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  graph.SerializeToString(e->mutable_graph_def());
2526fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  TF_ASSERT_OK(writer_->WriteEvent(std::move(e)));
2536fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  TF_ASSERT_OK(writer_->Flush());
2546fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  ASSERT_EQ(1LL, QueryInt("SELECT COUNT(*) FROM Runs"));
2556fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  ASSERT_EQ(1LL, QueryInt("SELECT COUNT(*) FROM Graphs"));
2566fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  ASSERT_EQ(4LL, QueryInt("SELECT COUNT(*) FROM Nodes"));
2576fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  ASSERT_EQ(3LL, QueryInt("SELECT COUNT(*) FROM NodeInputs"));
2586fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney
2596fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  int64 graph_id = QueryInt("SELECT graph_id FROM Graphs");
2606fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_GT(graph_id, 0LL);
2616fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ(graph_id, QueryInt("SELECT graph_id FROM Runs"));
2626fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ(0.023, QueryDouble("SELECT inserted_time FROM Graphs"));
2636fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_FALSE(QueryString("SELECT graph_def FROM Graphs").empty());
2646fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney
2656fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ("x", QueryString("SELECT node_name FROM Nodes WHERE node_id = 0"));
2666fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ("y", QueryString("SELECT node_name FROM Nodes WHERE node_id = 1"));
2676fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ("z", QueryString("SELECT node_name FROM Nodes WHERE node_id = 2"));
2686fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ("+", QueryString("SELECT node_name FROM Nodes WHERE node_id = 3"));
2696fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney
2706fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ("Placeholder",
2716fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney            QueryString("SELECT op FROM Nodes WHERE node_id = 0"));
2726fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ("Placeholder",
2736fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney            QueryString("SELECT op FROM Nodes WHERE node_id = 1"));
2746fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ("Love", QueryString("SELECT op FROM Nodes WHERE node_id = 2"));
2756fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ("Add", QueryString("SELECT op FROM Nodes WHERE node_id = 3"));
2766fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney
2776fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ("", QueryString("SELECT device FROM Nodes WHERE node_id = 0"));
2786fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ("", QueryString("SELECT device FROM Nodes WHERE node_id = 1"));
2796fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ("", QueryString("SELECT device FROM Nodes WHERE node_id = 2"));
2806fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ("tpu/lol",
2816fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney            QueryString("SELECT device FROM Nodes WHERE node_id = 3"));
2826fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney
2836fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ(graph_id,
2846fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney            QueryInt("SELECT graph_id FROM NodeInputs WHERE idx = 0"));
2856fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ(graph_id,
2866fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney            QueryInt("SELECT graph_id FROM NodeInputs WHERE idx = 1"));
2876fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ(graph_id,
2886fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney            QueryInt("SELECT graph_id FROM NodeInputs WHERE idx = 2"));
2896fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney
2906fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ(3LL, QueryInt("SELECT node_id FROM NodeInputs WHERE idx = 0"));
2916fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ(3LL, QueryInt("SELECT node_id FROM NodeInputs WHERE idx = 1"));
2926fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ(3LL, QueryInt("SELECT node_id FROM NodeInputs WHERE idx = 2"));
2936fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney
2946fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ(0LL,
2956fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney            QueryInt("SELECT input_node_id FROM NodeInputs WHERE idx = 0"));
2966fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ(1LL,
2976fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney            QueryInt("SELECT input_node_id FROM NodeInputs WHERE idx = 1"));
2986fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ(2LL,
2996fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney            QueryInt("SELECT input_node_id FROM NodeInputs WHERE idx = 2"));
3006fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney
3016fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ(0LL, QueryInt("SELECT is_control FROM NodeInputs WHERE idx = 0"));
3026fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ(0LL, QueryInt("SELECT is_control FROM NodeInputs WHERE idx = 1"));
3036fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ(1LL, QueryInt("SELECT is_control FROM NodeInputs WHERE idx = 2"));
3046fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney}
3056fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney
3067d17d27940aa915583b0b3e2ba77d9f708af6783Justine TunneyTEST_F(SummaryDbWriterTest, WriteScalarInt32_CoercesToInt64) {
3077d17d27940aa915583b0b3e2ba77d9f708af6783Justine Tunney  TF_ASSERT_OK(CreateSummaryDbWriter(db_, "", "", "", &env_, &writer_));
3087d17d27940aa915583b0b3e2ba77d9f708af6783Justine Tunney  Tensor t(DT_INT32, {});
3097d17d27940aa915583b0b3e2ba77d9f708af6783Justine Tunney  t.scalar<int32>()() = -17;
3107d17d27940aa915583b0b3e2ba77d9f708af6783Justine Tunney  TF_ASSERT_OK(writer_->WriteScalar(1, t, "t"));
3117d17d27940aa915583b0b3e2ba77d9f708af6783Justine Tunney  TF_ASSERT_OK(writer_->Flush());
3127d17d27940aa915583b0b3e2ba77d9f708af6783Justine Tunney  ASSERT_EQ(-17LL, QueryInt("SELECT tensor FROM Tensors"));
3137d17d27940aa915583b0b3e2ba77d9f708af6783Justine Tunney}
3147d17d27940aa915583b0b3e2ba77d9f708af6783Justine Tunney
3157d17d27940aa915583b0b3e2ba77d9f708af6783Justine TunneyTEST_F(SummaryDbWriterTest, WriteScalarInt8_CoercesToInt64) {
3167d17d27940aa915583b0b3e2ba77d9f708af6783Justine Tunney  TF_ASSERT_OK(CreateSummaryDbWriter(db_, "", "", "", &env_, &writer_));
3177d17d27940aa915583b0b3e2ba77d9f708af6783Justine Tunney  Tensor t(DT_INT8, {});
3187d17d27940aa915583b0b3e2ba77d9f708af6783Justine Tunney  t.scalar<int8>()() = static_cast<int8>(-17);
3197d17d27940aa915583b0b3e2ba77d9f708af6783Justine Tunney  TF_ASSERT_OK(writer_->WriteScalar(1, t, "t"));
3207d17d27940aa915583b0b3e2ba77d9f708af6783Justine Tunney  TF_ASSERT_OK(writer_->Flush());
3217d17d27940aa915583b0b3e2ba77d9f708af6783Justine Tunney  ASSERT_EQ(-17LL, QueryInt("SELECT tensor FROM Tensors"));
3227d17d27940aa915583b0b3e2ba77d9f708af6783Justine Tunney}
3237d17d27940aa915583b0b3e2ba77d9f708af6783Justine Tunney
3247d17d27940aa915583b0b3e2ba77d9f708af6783Justine TunneyTEST_F(SummaryDbWriterTest, WriteScalarUint8_CoercesToInt64) {
3257d17d27940aa915583b0b3e2ba77d9f708af6783Justine Tunney  TF_ASSERT_OK(CreateSummaryDbWriter(db_, "", "", "", &env_, &writer_));
3267d17d27940aa915583b0b3e2ba77d9f708af6783Justine Tunney  Tensor t(DT_UINT8, {});
3277d17d27940aa915583b0b3e2ba77d9f708af6783Justine Tunney  t.scalar<uint8>()() = static_cast<uint8>(254);
3287d17d27940aa915583b0b3e2ba77d9f708af6783Justine Tunney  TF_ASSERT_OK(writer_->WriteScalar(1, t, "t"));
3297d17d27940aa915583b0b3e2ba77d9f708af6783Justine Tunney  TF_ASSERT_OK(writer_->Flush());
3307d17d27940aa915583b0b3e2ba77d9f708af6783Justine Tunney  ASSERT_EQ(254LL, QueryInt("SELECT tensor FROM Tensors"));
3317d17d27940aa915583b0b3e2ba77d9f708af6783Justine Tunney}
3327d17d27940aa915583b0b3e2ba77d9f708af6783Justine Tunney
3336c4af6202c3984d7eabc8044c43579315c4b07a2Justine TunneyTEST_F(SummaryDbWriterTest, UsesIdsTable) {
3346c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  SummaryMetadata metadata;
3356c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  TF_ASSERT_OK(CreateSummaryDbWriter(db_, "mad-science", "train", "jart", &env_,
3366c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney                                     &writer_));
3376c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  env_.AdvanceByMillis(23);
3386c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  TF_ASSERT_OK(writer_->WriteTensor(1, MakeScalarInt64(123LL), "taggy",
3396c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney                                    metadata.SerializeAsString()));
3406c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  TF_ASSERT_OK(writer_->Flush());
3416c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  ASSERT_EQ(4LL, QueryInt("SELECT COUNT(*) FROM Ids"));
3426c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  EXPECT_EQ(4LL, QueryInt(strings::StrCat(
3436c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney                     "SELECT COUNT(*) FROM Ids WHERE id IN (",
3446c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney                     QueryInt("SELECT user_id FROM Users"), ", ",
3456c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney                     QueryInt("SELECT experiment_id FROM Experiments"), ", ",
3466c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney                     QueryInt("SELECT run_id FROM Runs"), ", ",
3476c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney                     QueryInt("SELECT tag_id FROM Tags"), ")")));
3486c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney}
3496c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney
3506c4af6202c3984d7eabc8044c43579315c4b07a2Justine TunneyTEST_F(SummaryDbWriterTest, SetsRunFinishedTime) {
3516c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  SummaryMetadata metadata;
3526c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  TF_ASSERT_OK(CreateSummaryDbWriter(db_, "mad-science", "train", "jart", &env_,
3536c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney                                     &writer_));
3546c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  env_.AdvanceByMillis(23);
3556c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  TF_ASSERT_OK(writer_->WriteTensor(1, MakeScalarInt64(123LL), "taggy",
3566c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney                                    metadata.SerializeAsString()));
3576c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  TF_ASSERT_OK(writer_->Flush());
3586c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  ASSERT_EQ(0.023, QueryDouble("SELECT started_time FROM Runs"));
3596c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  ASSERT_EQ(0.0, QueryDouble("SELECT finished_time FROM Runs"));
3606c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  env_.AdvanceByMillis(23);
3616c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  writer_->Unref();
3626c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  writer_ = nullptr;
3636c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  ASSERT_EQ(0.023, QueryDouble("SELECT started_time FROM Runs"));
3646c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  ASSERT_EQ(0.046, QueryDouble("SELECT finished_time FROM Runs"));
3656c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney}
3666c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney
3678f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney}  // namespace
3688f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney}  // namespace tensorflow
369