|
|
|
// Copyright (c) 2013, Facebook, Inc. All rights reserved.
|
|
|
|
// This source code is licensed under the BSD-style license found in the
|
|
|
|
// LICENSE file in the root directory of this source tree. An additional grant
|
|
|
|
// of patent rights can be found in the PATENTS file in the same directory.
|
|
|
|
//
|
|
|
|
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
|
|
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
|
|
// found in the LICENSE file. See the AUTHORS file for names of contributors.
|
|
|
|
|
|
|
|
#include "util/testharness.h"
|
|
|
|
#include <string>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <sys/stat.h>
|
|
|
|
#include <sys/types.h>
|
Better stack trace in MAC
Summary:
Now this gives us the real deal stack trace:
Assertion failed: (false), function GetProperty, file db/db_impl.cc, line 4072.
Received signal 6 (Abort trap: 6)
#0 0x7fff57ce39b9
#1 abort (in libsystem_c.dylib) + 125
#2 basename (in libsystem_c.dylib) + 0
#3 rocksdb::DBImpl::GetProperty(rocksdb::ColumnFamilyHandle*, rocksdb::Slice const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*) (in db_test) (db_impl.cc:4072)
#4 rocksdb::_Test_Empty::_Run() (in db_test) (testharness.h:68)
#5 rocksdb::_Test_Empty::_RunIt() (in db_test) (db_test.cc:1005)
#6 rocksdb::test::RunAllTests() (in db_test) (testharness.cc:60)
#7 main (in db_test) (db_test.cc:6697)
#8 start (in libdyld.dylib) + 1
Test Plan: added artificial assert, saw great stack trace
Reviewers: haobo, dhruba, ljin
Reviewed By: haobo
CC: leveldb
Differential Revision: https://reviews.facebook.net/D18309
11 years ago
|
|
|
#include "port/stack_trace.h"
|
|
|
|
|
|
|
|
namespace rocksdb {
|
|
|
|
namespace test {
|
|
|
|
|
|
|
|
namespace {
|
|
|
|
struct Test {
|
|
|
|
const char* base;
|
|
|
|
const char* name;
|
|
|
|
void (*func)();
|
|
|
|
};
|
|
|
|
std::vector<Test>* tests;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool RegisterTest(const char* base, const char* name, void (*func)()) {
|
|
|
|
if (tests == nullptr) {
|
|
|
|
tests = new std::vector<Test>;
|
|
|
|
}
|
|
|
|
Test t;
|
|
|
|
t.base = base;
|
|
|
|
t.name = name;
|
|
|
|
t.func = func;
|
|
|
|
tests->push_back(t);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
int RunAllTests() {
|
|
|
|
port::InstallStackTraceHandler();
|
|
|
|
|
|
|
|
const char* one_matcher = getenv("ROCKSDB_TESTS");
|
|
|
|
const char* from_matcher = getenv("ROCKSDB_TESTS_FROM");
|
|
|
|
|
|
|
|
int num = 0;
|
|
|
|
bool tests_on = (one_matcher == nullptr && from_matcher == nullptr);
|
|
|
|
if (tests != nullptr) {
|
|
|
|
for (unsigned int i = 0; i < tests->size(); i++) {
|
|
|
|
const Test& t = (*tests)[i];
|
|
|
|
if (tests_on == false) {
|
|
|
|
if (one_matcher != nullptr || from_matcher != nullptr) {
|
|
|
|
std::string name = t.base;
|
|
|
|
name.push_back('.');
|
|
|
|
name.append(t.name);
|
|
|
|
if (from_matcher != nullptr &&
|
|
|
|
strstr(name.c_str(), from_matcher) != nullptr) {
|
|
|
|
tests_on = true;
|
|
|
|
}
|
|
|
|
if (!tests_on) {
|
|
|
|
if (one_matcher == nullptr ||
|
|
|
|
strstr(name.c_str(), one_matcher) == nullptr) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
fprintf(stderr, "==== Test %s.%s\n", t.base, t.name);
|
|
|
|
(*t.func)();
|
|
|
|
++num;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
fprintf(stderr, "==== PASSED %d tests\n", num);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string TmpDir(Env* env) {
|
|
|
|
std::string dir;
|
|
|
|
Status s = env->GetTestDirectory(&dir);
|
rocksdb: Replace ASSERT* with EXPECT* in functions that does not return void value
Summary:
gtest does not use exceptions to fail a unit test by design, and `ASSERT*`s are implemented using `return`. As a consequence we cannot use `ASSERT*` in a function that does not return `void` value ([[ https://code.google.com/p/googletest/wiki/AdvancedGuide#Assertion_Placement | 1]]), and have to fix our existing code. This diff does this in a generic way, with no manual changes.
In order to detect all existing `ASSERT*` that are used in functions that doesn't return void value, I change the code to generate compile errors for such cases.
In `util/testharness.h` I defined `EXPECT*` assertions, the same way as `ASSERT*`, and redefined `ASSERT*` to return `void`. Then executed:
```lang=bash
% USE_CLANG=1 make all -j55 -k 2> build.log
% perl -naF: -e 'print "-- -number=".$F[1]." ".$F[0]."\n" if /: error:/' \
build.log | xargs -L 1 perl -spi -e 's/ASSERT/EXPECT/g if $. == $number'
% make format
```
After that I reverted back change to `ASSERT*` in `util/testharness.h`. But preserved introduced `EXPECT*`, which is the same as `ASSERT*`. This will be deleted once switched to gtest.
This diff is independent and contains manual changes only in `util/testharness.h`.
Test Plan:
Make sure all tests are passing.
```lang=bash
% USE_CLANG=1 make check
```
Reviewers: igor, lgalanis, sdong, yufei.zhu, rven, meyering
Reviewed By: meyering
Subscribers: dhruba, leveldb
Differential Revision: https://reviews.facebook.net/D33333
10 years ago
|
|
|
EXPECT_TRUE(s.ok()) << s.ToString();
|
|
|
|
return dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
int RandomSeed() {
|
|
|
|
const char* env = getenv("TEST_RANDOM_SEED");
|
|
|
|
int result = (env != nullptr ? atoi(env) : 301);
|
|
|
|
if (result <= 0) {
|
|
|
|
result = 301;
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
} // namespace test
|
|
|
|
} // namespace rocksdb
|