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