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