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
17febdd26ae594133d24f82544706b1e012a5cf1eaJustine Tunney#include "tensorflow/contrib/tensorboard/db/schema.h"
18febdd26ae594133d24f82544706b1e012a5cf1eaJustine Tunney#include "tensorflow/core/framework/function.pb.h"
196fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney#include "tensorflow/core/framework/graph.pb.h"
206fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney#include "tensorflow/core/framework/node_def.pb.h"
2135cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney#include "tensorflow/core/framework/summary.pb.h"
228f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney#include "tensorflow/core/lib/core/status_test_util.h"
238f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney#include "tensorflow/core/lib/db/sqlite.h"
2435cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney#include "tensorflow/core/lib/strings/strcat.h"
258f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney#include "tensorflow/core/platform/env.h"
268f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney#include "tensorflow/core/platform/test.h"
2735cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney#include "tensorflow/core/util/event.pb.h"
288f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
298f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunneynamespace tensorflow {
308f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunneynamespace {
318f7903b4c3699bc9129fa89d299699b1dfde6145Justine 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:
518401747ca8e940c580d6ce6b16c8a0a7da9e4e15Justine Tunney  void SetUp() override {
528401747ca8e940c580d6ce6b16c8a0a7da9e4e15Justine Tunney    TF_ASSERT_OK(Sqlite::Open(":memory:", SQLITE_OPEN_READWRITE, &db_));
53febdd26ae594133d24f82544706b1e012a5cf1eaJustine Tunney    TF_ASSERT_OK(SetupTensorboardSqliteDb(db_));
548401747ca8e940c580d6ce6b16c8a0a7da9e4e15Justine Tunney  }
558f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
568f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  void TearDown() override {
578f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    if (writer_ != nullptr) {
588f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney      writer_->Unref();
598f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney      writer_ = nullptr;
608f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    }
618401747ca8e940c580d6ce6b16c8a0a7da9e4e15Justine Tunney    db_->Unref();
628401747ca8e940c580d6ce6b16c8a0a7da9e4e15Justine Tunney    db_ = nullptr;
638f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  }
648f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
658f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  int64 QueryInt(const string& sql) {
66c026e3ffa08555927144e65abd9f681c6098d8c1Justine Tunney    SqliteStatement stmt = db_->PrepareOrDie(sql);
678f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    bool is_done;
688f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    Status s = stmt.Step(&is_done);
698f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    if (!s.ok() || is_done) {
708f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney      LOG(ERROR) << s << " due to " << sql;
718f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney      return -1;
728f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    }
738f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    return stmt.ColumnInt(0);
748f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  }
758f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
768f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  double QueryDouble(const string& sql) {
77c026e3ffa08555927144e65abd9f681c6098d8c1Justine Tunney    SqliteStatement stmt = db_->PrepareOrDie(sql);
788f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    bool is_done;
798f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    Status s = stmt.Step(&is_done);
808f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    if (!s.ok() || is_done) {
818f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney      LOG(ERROR) << s << " due to " << sql;
828f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney      return -1;
838f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    }
848f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    return stmt.ColumnDouble(0);
858f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  }
868f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
878f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  string QueryString(const string& sql) {
88c026e3ffa08555927144e65abd9f681c6098d8c1Justine Tunney    SqliteStatement stmt = db_->PrepareOrDie(sql);
898f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    bool is_done;
908f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    Status s = stmt.Step(&is_done);
918f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    if (!s.ok() || is_done) {
928f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney      LOG(ERROR) << s << " due to " << sql;
938f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney      return "MISSINGNO";
948f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    }
958f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney    return stmt.ColumnString(0);
968f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  }
978f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
988f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  FakeClockEnv env_;
998401747ca8e940c580d6ce6b16c8a0a7da9e4e15Justine Tunney  Sqlite* db_ = nullptr;
1008f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  SummaryWriterInterface* writer_ = nullptr;
1018f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney};
1028f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
1038f7903b4c3699bc9129fa89d299699b1dfde6145Justine TunneyTEST_F(SummaryDbWriterTest, NothingWritten_NoRowsCreated) {
1048f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  TF_ASSERT_OK(CreateSummaryDbWriter(db_, "mad-science", "train", "jart", &env_,
1058f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney                                     &writer_));
1068f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  TF_ASSERT_OK(writer_->Flush());
1078f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  writer_->Unref();
1088f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  writer_ = nullptr;
1096c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  EXPECT_EQ(0LL, QueryInt("SELECT COUNT(*) FROM Ids"));
1108f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ(0LL, QueryInt("SELECT COUNT(*) FROM Users"));
1118f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ(0LL, QueryInt("SELECT COUNT(*) FROM Experiments"));
1128f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ(0LL, QueryInt("SELECT COUNT(*) FROM Runs"));
1138f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ(0LL, QueryInt("SELECT COUNT(*) FROM Tags"));
1148f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ(0LL, QueryInt("SELECT COUNT(*) FROM Tensors"));
1158f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney}
1168f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
1178f7903b4c3699bc9129fa89d299699b1dfde6145Justine TunneyTEST_F(SummaryDbWriterTest, TensorsWritten_RowsGetInitialized) {
1186c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  SummaryMetadata metadata;
1196c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  metadata.set_display_name("display_name");
1206c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  metadata.set_summary_description("description");
1216c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  metadata.mutable_plugin_data()->set_plugin_name("plugin_name");
1226c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  metadata.mutable_plugin_data()->set_content("plugin_data");
1236c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  SummaryMetadata metadata_nope;
1246c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  metadata_nope.set_display_name("nope");
1256c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  metadata_nope.set_summary_description("nope");
1266c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  metadata_nope.mutable_plugin_data()->set_plugin_name("nope");
1276c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  metadata_nope.mutable_plugin_data()->set_content("nope");
1288f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  TF_ASSERT_OK(CreateSummaryDbWriter(db_, "mad-science", "train", "jart", &env_,
1298f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney                                     &writer_));
1308f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  env_.AdvanceByMillis(23);
1318f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  TF_ASSERT_OK(writer_->WriteTensor(1, MakeScalarInt64(123LL), "taggy",
1326c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney                                    metadata.SerializeAsString()));
1338f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  env_.AdvanceByMillis(23);
1346c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  TF_ASSERT_OK(writer_->WriteTensor(2, MakeScalarInt64(314LL), "taggy",
1356c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney                                    metadata_nope.SerializeAsString()));
1368f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  TF_ASSERT_OK(writer_->Flush());
1378f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
1388f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  ASSERT_EQ(1LL, QueryInt("SELECT COUNT(*) FROM Users"));
1398f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  ASSERT_EQ(1LL, QueryInt("SELECT COUNT(*) FROM Experiments"));
1408f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  ASSERT_EQ(1LL, QueryInt("SELECT COUNT(*) FROM Runs"));
1418f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  ASSERT_EQ(1LL, QueryInt("SELECT COUNT(*) FROM Tags"));
142febdd26ae594133d24f82544706b1e012a5cf1eaJustine Tunney  ASSERT_EQ(10000LL, QueryInt("SELECT COUNT(*) FROM Tensors"));
1438f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
1448f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  int64 user_id = QueryInt("SELECT user_id FROM Users");
1458f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  int64 experiment_id = QueryInt("SELECT experiment_id FROM Experiments");
1468f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  int64 run_id = QueryInt("SELECT run_id FROM Runs");
1478f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  int64 tag_id = QueryInt("SELECT tag_id FROM Tags");
1488f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_LT(0LL, user_id);
1498f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_LT(0LL, experiment_id);
1508f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_LT(0LL, run_id);
1518f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_LT(0LL, tag_id);
1528f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
1538f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ("jart", QueryString("SELECT user_name FROM Users"));
1548f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ(0.023, QueryDouble("SELECT inserted_time FROM Users"));
1558f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
1568f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ(user_id, QueryInt("SELECT user_id FROM Experiments"));
1578f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ("mad-science",
1588f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney            QueryString("SELECT experiment_name FROM Experiments"));
1598f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ(0.023, QueryDouble("SELECT inserted_time FROM Experiments"));
1608f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
1618f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ(experiment_id, QueryInt("SELECT experiment_id FROM Runs"));
1628f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ("train", QueryString("SELECT run_name FROM Runs"));
1638f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ(0.023, QueryDouble("SELECT inserted_time FROM Runs"));
1648f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
1658f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ(run_id, QueryInt("SELECT run_id FROM Tags"));
1668f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ("taggy", QueryString("SELECT tag_name FROM Tags"));
1678f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ(0.023, QueryDouble("SELECT inserted_time FROM Tags"));
1686c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney
1696c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  EXPECT_EQ("display_name", QueryString("SELECT display_name FROM Tags"));
1706c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  EXPECT_EQ("plugin_name", QueryString("SELECT plugin_name FROM Tags"));
1716c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  EXPECT_EQ("plugin_data", QueryString("SELECT plugin_data FROM Tags"));
1726c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  EXPECT_EQ("description", QueryString("SELECT description FROM Descriptions"));
1738f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
174febdd26ae594133d24f82544706b1e012a5cf1eaJustine Tunney  EXPECT_EQ(tag_id, QueryInt("SELECT series FROM Tensors WHERE step = 1"));
1758f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ(0.023,
1768f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney            QueryDouble("SELECT computed_time FROM Tensors WHERE step = 1"));
1778f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
178febdd26ae594133d24f82544706b1e012a5cf1eaJustine Tunney  EXPECT_EQ(tag_id, QueryInt("SELECT series FROM Tensors WHERE step = 2"));
1798f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney  EXPECT_EQ(0.046,
1808f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney            QueryDouble("SELECT computed_time FROM Tensors WHERE step = 2"));
1818f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney}
1828f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney
18335cc51dc2a716c4b92429db60238e4f15fba1ed3Justine TunneyTEST_F(SummaryDbWriterTest, EmptyParentNames_NoParentsCreated) {
18435cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  TF_ASSERT_OK(CreateSummaryDbWriter(db_, "", "", "", &env_, &writer_));
1856c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  TF_ASSERT_OK(writer_->WriteTensor(1, MakeScalarInt64(123LL), "taggy", ""));
18635cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  TF_ASSERT_OK(writer_->Flush());
18735cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  ASSERT_EQ(0LL, QueryInt("SELECT COUNT(*) FROM Users"));
18835cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  ASSERT_EQ(0LL, QueryInt("SELECT COUNT(*) FROM Experiments"));
18935cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  ASSERT_EQ(0LL, QueryInt("SELECT COUNT(*) FROM Runs"));
19035cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  ASSERT_EQ(1LL, QueryInt("SELECT COUNT(*) FROM Tags"));
191febdd26ae594133d24f82544706b1e012a5cf1eaJustine Tunney  ASSERT_EQ(10000LL, QueryInt("SELECT COUNT(*) FROM Tensors"));
19235cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney}
19335cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney
19435cc51dc2a716c4b92429db60238e4f15fba1ed3Justine TunneyTEST_F(SummaryDbWriterTest, WriteEvent_Scalar) {
19535cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  TF_ASSERT_OK(CreateSummaryDbWriter(db_, "", "", "", &env_, &writer_));
19635cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  std::unique_ptr<Event> e{new Event};
19735cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  e->set_step(7);
19835cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  e->set_wall_time(123.456);
19935cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  Summary::Value* s = e->mutable_summary()->add_value();
20035cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  s->set_tag("π");
20135cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  s->set_simple_value(3.14f);
20235cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  s = e->mutable_summary()->add_value();
20335cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  s->set_tag("φ");
20435cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  s->set_simple_value(1.61f);
20535cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  TF_ASSERT_OK(writer_->WriteEvent(std::move(e)));
20635cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  TF_ASSERT_OK(writer_->Flush());
20735cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  ASSERT_EQ(2LL, QueryInt("SELECT COUNT(*) FROM Tags"));
208febdd26ae594133d24f82544706b1e012a5cf1eaJustine Tunney  ASSERT_EQ(20000LL, QueryInt("SELECT COUNT(*) FROM Tensors"));
20935cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  int64 tag1_id = QueryInt("SELECT tag_id FROM Tags WHERE tag_name = 'π'");
21035cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  int64 tag2_id = QueryInt("SELECT tag_id FROM Tags WHERE tag_name = 'φ'");
21135cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  EXPECT_GT(tag1_id, 0LL);
21235cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  EXPECT_GT(tag2_id, 0LL);
21335cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  EXPECT_EQ(123.456, QueryDouble(strings::StrCat(
214febdd26ae594133d24f82544706b1e012a5cf1eaJustine Tunney                         "SELECT computed_time FROM Tensors WHERE series = ",
21535cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney                         tag1_id, " AND step = 7")));
21635cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney  EXPECT_EQ(123.456, QueryDouble(strings::StrCat(
217febdd26ae594133d24f82544706b1e012a5cf1eaJustine Tunney                         "SELECT computed_time FROM Tensors WHERE series = ",
21835cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney                         tag2_id, " AND step = 7")));
21935cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney}
22035cc51dc2a716c4b92429db60238e4f15fba1ed3Justine Tunney
2216fb721d608c4cd3855fe8793099a629428b9853cJustine TunneyTEST_F(SummaryDbWriterTest, WriteGraph) {
2226fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  TF_ASSERT_OK(CreateSummaryDbWriter(db_, "", "R", "", &env_, &writer_));
2236fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  env_.AdvanceByMillis(23);
2246fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  GraphDef graph;
225febdd26ae594133d24f82544706b1e012a5cf1eaJustine Tunney  graph.mutable_library()->add_gradient()->set_function_name("funk");
2266fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  NodeDef* node = graph.add_node();
2276fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  node->set_name("x");
2286fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  node->set_op("Placeholder");
2296fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  node = graph.add_node();
2306fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  node->set_name("y");
2316fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  node->set_op("Placeholder");
2326fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  node = graph.add_node();
2336fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  node->set_name("z");
2346fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  node->set_op("Love");
2356fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  node = graph.add_node();
2366fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  node->set_name("+");
2376fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  node->set_op("Add");
2386fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  node->add_input("x");
2396fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  node->add_input("y");
2406fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  node->add_input("^z");
2416fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  node->set_device("tpu/lol");
2426fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  std::unique_ptr<Event> e{new Event};
2436fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  graph.SerializeToString(e->mutable_graph_def());
2446fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  TF_ASSERT_OK(writer_->WriteEvent(std::move(e)));
2456fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  TF_ASSERT_OK(writer_->Flush());
2466fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  ASSERT_EQ(1LL, QueryInt("SELECT COUNT(*) FROM Runs"));
2476fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  ASSERT_EQ(1LL, QueryInt("SELECT COUNT(*) FROM Graphs"));
2486fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  ASSERT_EQ(4LL, QueryInt("SELECT COUNT(*) FROM Nodes"));
2496fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  ASSERT_EQ(3LL, QueryInt("SELECT COUNT(*) FROM NodeInputs"));
2506fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney
251febdd26ae594133d24f82544706b1e012a5cf1eaJustine Tunney  ASSERT_EQ(QueryInt("SELECT run_id FROM Runs"),
252febdd26ae594133d24f82544706b1e012a5cf1eaJustine Tunney            QueryInt("SELECT run_id FROM Graphs"));
253febdd26ae594133d24f82544706b1e012a5cf1eaJustine Tunney
2546fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  int64 graph_id = QueryInt("SELECT graph_id FROM Graphs");
2556fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_GT(graph_id, 0LL);
2566fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ(0.023, QueryDouble("SELECT inserted_time FROM Graphs"));
257febdd26ae594133d24f82544706b1e012a5cf1eaJustine Tunney
258febdd26ae594133d24f82544706b1e012a5cf1eaJustine Tunney  GraphDef graph2;
259febdd26ae594133d24f82544706b1e012a5cf1eaJustine Tunney  graph2.ParseFromString(QueryString("SELECT graph_def FROM Graphs"));
260febdd26ae594133d24f82544706b1e012a5cf1eaJustine Tunney  EXPECT_EQ(0, graph2.node_size());
261febdd26ae594133d24f82544706b1e012a5cf1eaJustine Tunney  EXPECT_EQ("funk", graph2.library().gradient(0).function_name());
2626fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney
2636fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ("x", QueryString("SELECT node_name FROM Nodes WHERE node_id = 0"));
2646fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ("y", QueryString("SELECT node_name FROM Nodes WHERE node_id = 1"));
2656fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ("z", QueryString("SELECT node_name FROM Nodes WHERE node_id = 2"));
2666fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ("+", QueryString("SELECT node_name FROM Nodes WHERE node_id = 3"));
2676fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney
2686fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ("Placeholder",
2696fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney            QueryString("SELECT op FROM Nodes WHERE node_id = 0"));
2706fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ("Placeholder",
2716fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney            QueryString("SELECT op FROM Nodes WHERE node_id = 1"));
2726fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ("Love", QueryString("SELECT op FROM Nodes WHERE node_id = 2"));
2736fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ("Add", QueryString("SELECT op FROM Nodes WHERE node_id = 3"));
2746fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney
2756fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ("", QueryString("SELECT device FROM Nodes WHERE node_id = 0"));
2766fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ("", QueryString("SELECT device FROM Nodes WHERE node_id = 1"));
2776fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ("", QueryString("SELECT device FROM Nodes WHERE node_id = 2"));
2786fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ("tpu/lol",
2796fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney            QueryString("SELECT device FROM Nodes WHERE node_id = 3"));
2806fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney
2816fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ(graph_id,
2826fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney            QueryInt("SELECT graph_id FROM NodeInputs WHERE idx = 0"));
2836fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ(graph_id,
2846fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney            QueryInt("SELECT graph_id FROM NodeInputs WHERE idx = 1"));
2856fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ(graph_id,
2866fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney            QueryInt("SELECT graph_id FROM NodeInputs WHERE idx = 2"));
2876fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney
2886fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ(3LL, QueryInt("SELECT node_id FROM NodeInputs WHERE idx = 0"));
2896fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ(3LL, QueryInt("SELECT node_id FROM NodeInputs WHERE idx = 1"));
2906fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ(3LL, QueryInt("SELECT node_id FROM NodeInputs WHERE idx = 2"));
2916fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney
2926fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ(0LL,
2936fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney            QueryInt("SELECT input_node_id FROM NodeInputs WHERE idx = 0"));
2946fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ(1LL,
2956fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney            QueryInt("SELECT input_node_id FROM NodeInputs WHERE idx = 1"));
2966fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ(2LL,
2976fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney            QueryInt("SELECT input_node_id FROM NodeInputs WHERE idx = 2"));
2986fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney
2996fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ(0LL, QueryInt("SELECT is_control FROM NodeInputs WHERE idx = 0"));
3006fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ(0LL, QueryInt("SELECT is_control FROM NodeInputs WHERE idx = 1"));
3016fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney  EXPECT_EQ(1LL, QueryInt("SELECT is_control FROM NodeInputs WHERE idx = 2"));
3026fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney}
3036fb721d608c4cd3855fe8793099a629428b9853cJustine Tunney
3046c4af6202c3984d7eabc8044c43579315c4b07a2Justine TunneyTEST_F(SummaryDbWriterTest, UsesIdsTable) {
3056c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  SummaryMetadata metadata;
3066c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  TF_ASSERT_OK(CreateSummaryDbWriter(db_, "mad-science", "train", "jart", &env_,
3076c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney                                     &writer_));
3086c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  env_.AdvanceByMillis(23);
3096c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  TF_ASSERT_OK(writer_->WriteTensor(1, MakeScalarInt64(123LL), "taggy",
3106c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney                                    metadata.SerializeAsString()));
3116c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  TF_ASSERT_OK(writer_->Flush());
3126c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  ASSERT_EQ(4LL, QueryInt("SELECT COUNT(*) FROM Ids"));
3136c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  EXPECT_EQ(4LL, QueryInt(strings::StrCat(
3146c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney                     "SELECT COUNT(*) FROM Ids WHERE id IN (",
3156c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney                     QueryInt("SELECT user_id FROM Users"), ", ",
3166c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney                     QueryInt("SELECT experiment_id FROM Experiments"), ", ",
3176c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney                     QueryInt("SELECT run_id FROM Runs"), ", ",
3186c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney                     QueryInt("SELECT tag_id FROM Tags"), ")")));
3196c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney}
3206c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney
3216c4af6202c3984d7eabc8044c43579315c4b07a2Justine TunneyTEST_F(SummaryDbWriterTest, SetsRunFinishedTime) {
3226c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  SummaryMetadata metadata;
3236c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  TF_ASSERT_OK(CreateSummaryDbWriter(db_, "mad-science", "train", "jart", &env_,
3246c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney                                     &writer_));
3256c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  env_.AdvanceByMillis(23);
3266c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  TF_ASSERT_OK(writer_->WriteTensor(1, MakeScalarInt64(123LL), "taggy",
3276c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney                                    metadata.SerializeAsString()));
3286c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  TF_ASSERT_OK(writer_->Flush());
3296c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  ASSERT_EQ(0.023, QueryDouble("SELECT started_time FROM Runs"));
3306c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  ASSERT_EQ(0.0, QueryDouble("SELECT finished_time FROM Runs"));
3316c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  env_.AdvanceByMillis(23);
3326c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  writer_->Unref();
3336c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  writer_ = nullptr;
3346c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  ASSERT_EQ(0.023, QueryDouble("SELECT started_time FROM Runs"));
3356c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney  ASSERT_EQ(0.046, QueryDouble("SELECT finished_time FROM Runs"));
3366c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney}
3376c4af6202c3984d7eabc8044c43579315c4b07a2Justine Tunney
3388f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney}  // namespace
3398f7903b4c3699bc9129fa89d299699b1dfde6145Justine Tunney}  // namespace tensorflow
340