174 lines
4.3 KiB
C++
174 lines
4.3 KiB
C++
/* Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; version 2 of the License.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */
|
|
|
|
// First include (the generated) my_config.h, to get correct platform defines.
|
|
#include "my_config.h"
|
|
#include <gtest/gtest.h>
|
|
|
|
#include "thread_utils.h"
|
|
|
|
#include "my_global.h"
|
|
#include "my_dbug.h"
|
|
|
|
using thread::Notification;
|
|
using thread::Thread;
|
|
|
|
namespace dbug_unittest {
|
|
|
|
#if defined(DBUG_OFF)
|
|
TEST(DebugTest, NoSuicide)
|
|
{
|
|
DBUG_SUICIDE();
|
|
}
|
|
#else
|
|
TEST(DebugDeathTest, Suicide)
|
|
{
|
|
::testing::FLAGS_gtest_death_test_style = "threadsafe";
|
|
EXPECT_DEATH_IF_SUPPORTED(DBUG_SUICIDE(), "");
|
|
}
|
|
#endif
|
|
|
|
|
|
#if !defined(DBUG_OFF) && !defined(_WIN32)
|
|
class DbugGcovThread : public Thread
|
|
{
|
|
public:
|
|
DbugGcovThread(Notification *start_notification)
|
|
: m_start_notification(start_notification)
|
|
{}
|
|
|
|
virtual void run()
|
|
{
|
|
m_start_notification->notify();
|
|
_db_flush_gcov_();
|
|
}
|
|
|
|
private:
|
|
Notification *m_start_notification;
|
|
};
|
|
|
|
|
|
TEST(DebugFlushGcov, FlushGcovParallel)
|
|
{
|
|
Notification start_notification;
|
|
DbugGcovThread debug_thread(&start_notification);
|
|
debug_thread.start();
|
|
|
|
// Wait for the other thread to start, then flush in parallel.
|
|
start_notification.wait_for_notification();
|
|
_db_flush_gcov_();
|
|
debug_thread.join();
|
|
}
|
|
#endif
|
|
|
|
|
|
#if !defined(DBUG_OFF)
|
|
TEST(DebugPrintTest, PrintEval)
|
|
{
|
|
int y= 0;
|
|
|
|
// This DBUG_PRINT args should never be evaluated.
|
|
DBUG_PRINT("never",("%d", y+= 1));
|
|
EXPECT_EQ(y, 0) << "DBUG_PRINT arg is evaluated.";
|
|
}
|
|
|
|
|
|
TEST(DebugPrintEvalTest, PrintEval)
|
|
{
|
|
int y= 0;
|
|
|
|
DBUG_SET("+d,never");
|
|
DBUG_PRINT("never",("%d", y+= 1));
|
|
DBUG_SET("");
|
|
EXPECT_GE(y, 1) << "DBUG_PRINT arg is not evaluated.";
|
|
}
|
|
|
|
|
|
TEST(DebugSetTest, DebugKeywordsTest)
|
|
{
|
|
char buf[1024];
|
|
|
|
/*
|
|
Enable d flag, then enable debug on a keyword. The debug should
|
|
remain set to d and empty list of keywords indicating debug is
|
|
enabled for all.
|
|
*/
|
|
DBUG_SET("d");
|
|
DBUG_SET("+d,keyword");
|
|
DBUG_EXPLAIN(buf, sizeof(buf));
|
|
EXPECT_STREQ("d", buf);
|
|
DBUG_SET("");
|
|
|
|
/*
|
|
Set debug on a specific keyword. Debug should be enabled
|
|
for the keyword.
|
|
*/
|
|
DBUG_SET("+d,keyword");
|
|
DBUG_EXPLAIN(buf, sizeof(buf));
|
|
EXPECT_STREQ("d,keyword", buf);
|
|
|
|
/*
|
|
Remove the keyword from debug list. Debug should be
|
|
disabled.
|
|
*/
|
|
DBUG_SET("-d,keyword");
|
|
DBUG_EXPLAIN(buf, sizeof(buf));
|
|
EXPECT_STREQ("",buf);
|
|
DBUG_SET("");
|
|
|
|
/*
|
|
Enable debug for a keyword. Then enable debug for all
|
|
keywords. Debug should now be enabled for all keywords.
|
|
*/
|
|
DBUG_SET("+d,keyword");
|
|
DBUG_SET("+d");
|
|
DBUG_EXPLAIN(buf,sizeof(buf));
|
|
EXPECT_STREQ("d",buf);
|
|
DBUG_SET("");
|
|
|
|
// Add multiple debug keywords.
|
|
DBUG_SET("+d,keyword1");
|
|
DBUG_SET("+d,keyword2");
|
|
DBUG_EXPLAIN(buf,sizeof(buf));
|
|
EXPECT_STREQ("d,keyword1,keyword2",buf);
|
|
DBUG_SET("-d,keyword1");
|
|
DBUG_EXPLAIN(buf,sizeof(buf));
|
|
EXPECT_STREQ("d,keyword2",buf);
|
|
DBUG_SET("-d,keyword2");
|
|
DBUG_EXPLAIN(buf,sizeof(buf));
|
|
EXPECT_STREQ("",buf);
|
|
DBUG_SET("");
|
|
|
|
// Add two keywords, the second keyword being a prefix of the first keyword.
|
|
DBUG_SET("+d,simulate_file_error_once,simulate_file_error");
|
|
DBUG_EXPLAIN(buf,sizeof(buf));
|
|
EXPECT_STREQ("d,simulate_file_error_once,simulate_file_error",buf);
|
|
DBUG_SET("");
|
|
|
|
// Add same keyword thrice, keyword should show up once in debug list.
|
|
DBUG_SET("+d,keyword,keyword,keyword");
|
|
DBUG_EXPLAIN(buf,sizeof(buf));
|
|
EXPECT_STREQ("d,keyword",buf);
|
|
DBUG_SET("");
|
|
|
|
// Add some combination of keywords with whitespace and duplicates.
|
|
DBUG_SET("+d, keyword1, keyword2, keyword1,keyword3 ");
|
|
DBUG_EXPLAIN(buf,sizeof(buf));
|
|
EXPECT_STREQ("d,keyword1,keyword2,keyword3",buf);
|
|
DBUG_SET("");
|
|
}
|
|
#endif /* DBUG_OFF */
|
|
}
|