1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef PPAPI_TESTS_TEST_CASE_H_
6 #define PPAPI_TESTS_TEST_CASE_H_
15 #include "ppapi/c/pp_resource.h"
16 #include "ppapi/c/pp_time.h"
17 #include "ppapi/c/private/ppb_testing_private.h"
18 #include "ppapi/cpp/dev/scrollbar_dev.h"
19 #include "ppapi/cpp/message_loop.h"
20 #include "ppapi/cpp/view.h"
21 #include "ppapi/tests/test_utils.h"
22 #include "ppapi/tests/testing_instance.h"
24 #if (defined __native_client__)
25 #include "ppapi/cpp/var.h"
27 #include "ppapi/cpp/private/var_private.h"
30 class TestingInstance
;
33 namespace deprecated
{
34 class ScriptableObject
;
38 // Individual classes of tests derive from this generic test case.
41 explicit TestCase(TestingInstance
* instance
);
44 // Optionally override to do testcase specific initialization.
45 // Default implementation just returns true.
48 // Override to implement the test case. It will be called after the plugin is
49 // first displayed, passing a string. If the string is empty, RunTests should
50 // run all tests for this test case. Otherwise, it must be a comma-delimited
51 // list of test names, possibly prefixed. E.g.:
52 // "Foo_GoodTest,DISABLED_Foo_BadTest,Foo_OtherGoodTest"
53 // All listed tests which are not prefixed will be run.
55 // This should generally be implemented in a TestCase subclass using the
57 virtual void RunTests(const std::string
& test_filter
) = 0;
59 static std::string
MakeFailureMessage(const char* file
, int line
,
62 #if !(defined __native_client__)
63 // Returns the scriptable test object for the current test, if any.
64 // Internally, this uses CreateTestObject which each test overrides.
65 pp::VarPrivate
GetTestObject();
66 void ResetTestObject() { test_object_
= pp::VarPrivate(); }
69 // A function that is invoked whenever HandleMessage is called on the
70 // associated TestingInstance. Default implementation does nothing. TestCases
71 // that want to handle incoming postMessage events should override this
73 virtual void HandleMessage(const pp::Var
& message_data
);
75 // A function that is invoked whenever DidChangeView is called on the
76 // associated TestingInstance. Default implementation does nothing. TestCases
77 // that want to handle view changes should override this method.
78 virtual void DidChangeView(const pp::View
& view
);
80 // A function that is invoked whenever HandleInputEvent is called on the
81 // associated TestingInstance. Default implementation returns false. TestCases
82 // that want to handle view changes should override this method.
83 virtual bool HandleInputEvent(const pp::InputEvent
& event
);
85 void IgnoreLeakedVar(int64_t id
);
87 TestingInstance
* instance() { return instance_
; }
89 const PPB_Testing_Private
* testing_interface() { return testing_interface_
; }
91 static void QuitMainMessageLoop(PP_Instance instance
);
93 const std::map
<std::string
, bool>& remaining_tests() {
94 return remaining_tests_
;
96 const std::set
<std::string
>& skipped_tests() {
97 return skipped_tests_
;
101 #if !(defined __native_client__)
102 // Overridden by each test to supply a ScriptableObject corresponding to the
103 // test. There can only be one object created for all tests in a given class,
104 // so be sure your object is designed to be re-used.
106 // This object should be created on the heap. Ownership will be passed to the
107 // caller. Return NULL if there is no supported test object (the default).
108 virtual pp::deprecated::ScriptableObject
* CreateTestObject();
111 // Checks whether the testing interface is available. Returns true if it is,
112 // false otherwise. If it is not available, adds a descriptive error. This is
113 // for use by tests that require the testing interface.
114 bool CheckTestingInterface();
116 // Makes sure the test is run over HTTP.
117 bool EnsureRunningOverHTTP();
119 // Returns true if |filter| only contains a TestCase name, which normally
120 // means "run all tests". Some TestCases require special setup for individual
121 // tests, and can use this function to decide whether to ignore those tests.
122 bool ShouldRunAllTests(const std::string
& filter
);
124 // Return true if the given test name matches the filter. This is true if
125 // (a) filter is empty or (b) test_name matches a test name listed in filter
127 bool ShouldRunTest(const std::string
& test_name
, const std::string
& filter
);
129 // Check for leaked resources and vars at the end of the test. If any exist,
130 // return a string with some information about the error. Otherwise, return
133 // You should pass the error string from the test so far; if it is non-empty,
134 // CheckResourcesAndVars will do nothing and return the same string.
135 std::string
CheckResourcesAndVars(std::string errors
);
137 PP_TimeTicks
NowInTimeTicks();
139 // Run the given test method on a background thread and return the result.
141 std::string
RunOnThread(std::string(T::*test_to_run
)()) {
142 if (!testing_interface_
) {
143 return "Testing blocking callbacks requires the testing interface. In "
144 "Chrome, use the --enable-pepper-testing flag.";
146 // These tests are only valid if running out-of-process (threading is not
147 // supported in-process). For in-process, just consider it a pass.
148 if (!testing_interface_
->IsOutOfProcess())
149 return std::string();
150 pp::MessageLoop
background_loop(instance_
);
151 ThreadedTestRunner
<T
> runner(instance_
->pp_instance(),
152 static_cast<T
*>(this), test_to_run
, background_loop
);
153 RunOnThreadInternal(&ThreadedTestRunner
<T
>::ThreadFunction
, &runner
,
155 return runner
.result();
158 // Pointer to the instance that owns us.
159 TestingInstance
* instance_
;
161 // NULL unless InitTestingInterface is called.
162 const PPB_Testing_Private
* testing_interface_
;
164 void set_callback_type(CallbackType callback_type
) {
165 callback_type_
= callback_type
;
167 CallbackType
callback_type() const {
168 return callback_type_
;
173 class ThreadedTestRunner
{
175 typedef std::string(T::*TestMethodType
)();
176 ThreadedTestRunner(PP_Instance instance
,
178 TestMethodType test_to_run
,
179 pp::MessageLoop loop
)
180 : instance_(instance
),
181 test_case_(test_case
),
182 test_to_run_(test_to_run
),
185 const std::string
& result() { return result_
; }
186 static void ThreadFunction(void* runner
) {
187 static_cast<ThreadedTestRunner
<T
>*>(runner
)->Run();
192 int32_t result
= loop_
.AttachToCurrentThread();
193 static_cast<void>(result
); // result is not used in the RELEASE build.
194 PP_DCHECK(PP_OK
== result
);
195 result_
= (test_case_
->*test_to_run_
)();
196 // Now give the loop a chance to clean up.
197 loop_
.PostQuit(true /* should_destroy */);
199 // Tell the main thread to quit its nested message loop, now that the test
201 TestCase::QuitMainMessageLoop(instance_
);
205 PP_Instance instance_
;
207 TestMethodType test_to_run_
;
208 pp::MessageLoop loop_
;
211 // The internals for RunOnThread. This allows us to avoid including
212 // pp_thread.h in this header file, since it includes system headers like
214 // RunOnThreadInternal launches a new thread to run |thread_func|, waits
215 // for it to complete using RunMessageLoop(), then joins.
216 void RunOnThreadInternal(void (*thread_func
)(void*),
218 const PPB_Testing_Private
* testing_interface
);
220 static void DoQuitMainMessageLoop(void* pp_instance
, int32_t result
);
222 // Passed when creating completion callbacks in some tests. This determines
223 // what kind of callback we use for the test.
224 CallbackType callback_type_
;
226 // Var ids that should be ignored when checking for leaks on shutdown.
227 std::set
<int64_t> ignored_leaked_vars_
;
229 // The tests that were found in test_filter. The bool indicates whether the
230 // test should be run (i.e., it will be false if the test name was prefixed in
231 // the test_filter string).
233 // This is initialized lazily the first time that ShouldRunTest is called.
234 std::map
<std::string
, bool> filter_tests_
;
235 // Flag indicating whether we have populated filter_tests_ yet.
236 bool have_populated_filter_tests_
;
237 // This is initialized with the contents of filter_tests_. As each test is
238 // run, it is removed from remaining_tests_. When RunTests is finished,
239 // remaining_tests_ should be empty. Any remaining tests are tests that were
240 // listed in the test_filter but didn't match any calls to ShouldRunTest,
241 // meaning it was probably a typo. TestingInstance should log this and
242 // consider it a failure.
243 std::map
<std::string
, bool> remaining_tests_
;
245 // If ShouldRunTest is called but the given test name doesn't match anything
246 // in the test_filter, the test name will be added here. This allows
247 // TestingInstance to detect when not all tests were listed.
248 std::set
<std::string
> skipped_tests_
;
250 #if !(defined __native_client__)
251 // Holds the test object, if any was retrieved from CreateTestObject.
252 pp::VarPrivate test_object_
;
256 // This class is an implementation detail.
257 class TestCaseFactory
{
259 typedef TestCase
* (*Method
)(TestingInstance
* instance
);
261 TestCaseFactory(const char* name
, Method method
)
269 friend class TestingInstance
;
271 TestCaseFactory
* next_
;
275 static TestCaseFactory
* head_
;
280 // The internal namespace contains implementation details that are used by
281 // the ASSERT macros.
283 // This base class provides a ToString that works for classes that can be
284 // converted to a string using std::stringstream. Later, we'll do
285 // specializations for types that we know will work with this approach.
287 struct StringinatorBase
{
288 static std::string
ToString(const T
& value
) {
289 std::stringstream stream
;
294 // Not implemented, do not use.
295 // Note, these are protected because Windows complains if I make these private
296 // and then inherit StringinatorBase (even though they're never used).
301 // This default class template is for types that we don't recognize as
302 // something we can convert into a string using stringstream. Types that we
303 // know *can* be turned to a string should have specializations below.
305 struct Stringinator
{
306 static std::string
ToString(const T
& value
) {
307 return std::string();
310 // Not implemented, do not use.
315 // Define some full specializations for types that can just use stringstream.
316 #define DEFINE_STRINGINATOR_FOR_TYPE(type) \
318 struct Stringinator<type> : public StringinatorBase<type> {};
319 DEFINE_STRINGINATOR_FOR_TYPE(int32_t);
320 DEFINE_STRINGINATOR_FOR_TYPE(uint32_t);
321 DEFINE_STRINGINATOR_FOR_TYPE(int64_t);
322 DEFINE_STRINGINATOR_FOR_TYPE(uint64_t);
323 DEFINE_STRINGINATOR_FOR_TYPE(float);
324 DEFINE_STRINGINATOR_FOR_TYPE(double);
325 DEFINE_STRINGINATOR_FOR_TYPE(bool);
326 DEFINE_STRINGINATOR_FOR_TYPE(std::string
);
327 #undef DEFINE_STRINGINATOR_FOR_TYPE
330 std::string
ToString(const T
& param
) {
331 return Stringinator
<T
>::ToString(param
);
334 // This overload is necessary to allow enum values (such as those from
335 // pp_errors.h, including PP_OK) to work. They won't automatically convert to
336 // an integral type to instantiate the above function template.
337 inline std::string
ToString(int32_t param
) {
338 return Stringinator
<int32_t>::ToString(param
);
341 inline std::string
ToString(const char* c_string
) {
342 return std::string(c_string
);
345 // This overload deals with pointers.
347 std::string
ToString(const T
* ptr
) {
348 uintptr_t ptr_val
= reinterpret_cast<uintptr_t>(ptr
);
349 std::stringstream stream
;
354 // ComparisonHelper classes wrap the left-hand parameter of a binary comparison
355 // ASSERT. The correct class gets chosen based on whether or not it's a NULL or
356 // 0 literal. If it is a NULL/0 literal, we use NullLiteralComparisonHelper.
357 // For all other parameters, we use ComparisonHelper. There's also a
358 // specialization of ComparisonHelper for int below (see below for why
361 // ComparisonHelper does two things for the left param:
362 // 1) Provides all the appropriate CompareXX functions (CompareEQ, etc).
363 // 2) Provides ToString.
365 struct ComparisonHelper
{
366 explicit ComparisonHelper(const T
& param
) : value(param
) {}
368 bool CompareEQ(const U
& right
) const {
369 return value
== right
;
372 bool CompareNE(const U
& right
) const {
373 return value
!= right
;
376 bool CompareLT(const U
& right
) const {
377 return value
< right
;
380 bool CompareGT(const U
& right
) const {
381 return value
> right
;
384 bool CompareLE(const U
& right
) const {
385 return value
<= right
;
388 bool CompareGE(const U
& right
) const {
389 return value
>= right
;
391 std::string
ToString() const {
392 return internal::ToString(value
);
397 // Used for NULL or 0.
398 struct NullLiteralComparisonHelper
{
399 NullLiteralComparisonHelper() : value(0) {}
401 bool CompareEQ(const U
& right
) const {
405 bool CompareNE(const U
& right
) const {
409 bool CompareLT(const U
& right
) const {
413 bool CompareGT(const U
& right
) const {
417 bool CompareLE(const U
& right
) const {
421 bool CompareGE(const U
& right
) const {
424 std::string
ToString() const {
425 return std::string("0");
430 // This class makes it safe to use an integer literal (like 5, or 123) when
431 // comparing with an unsigned. For example:
432 // ASSERT_EQ(1, some_vector.size());
433 // We do a lot of those comparisons, so this makes it easy to get it right
434 // (rather than forcing assertions to use unsigned literals like 5u or 123u).
436 // This is slightly risky; we're static_casting an int to whatever's on the
437 // right. If the left value is negative and the right hand side is a large
438 // unsigned value, it's possible that the comparison will succeed when maybe
439 // it shouldn't have.
440 // TODO(dmichael): It should be possible to fix this and upgrade int32_t and
441 // uint32_t to int64_t for the comparison, and make any unsafe
442 // comparisons into compile errors.
444 struct ComparisonHelper
<int> {
445 explicit ComparisonHelper(int param
) : value(param
) {}
447 bool CompareEQ(const U
& right
) const {
448 return static_cast<U
>(value
) == right
;
451 bool CompareNE(const U
& right
) const {
452 return static_cast<U
>(value
) != right
;
455 bool CompareLT(const U
& right
) const {
456 return static_cast<U
>(value
) < right
;
459 bool CompareGT(const U
& right
) const {
460 return static_cast<U
>(value
) > right
;
463 bool CompareLE(const U
& right
) const {
464 return static_cast<U
>(value
) <= right
;
467 bool CompareGE(const U
& right
) const {
468 return static_cast<U
>(value
) >= right
;
470 std::string
ToString() const {
471 return internal::ToString(value
);
477 // The default is for the case there the parameter is *not* a NULL or 0 literal.
478 template <bool is_null_literal
>
479 struct ParameterWrapper
{
481 static ComparisonHelper
<T
> WrapValue(const T
& value
) {
482 return ComparisonHelper
<T
>(value
);
484 // This overload is so that we can deal with values from anonymous enums,
485 // like the one in pp_errors.h. The function template above won't be
486 // considered a match by the compiler.
487 static ComparisonHelper
<int> WrapValue(int value
) {
488 return ComparisonHelper
<int>(value
);
492 // The parameter to WrapValue *is* a NULL or 0 literal.
494 struct ParameterWrapper
<true> {
495 // We just use "..." and ignore the parameter. This sidesteps some problems we
496 // would run in to (not all compilers have the same set of constraints).
497 // - We can't use a pointer type, because int and enums won't convert.
498 // - We can't use an integral type, because pointers won't convert.
499 // - We can't overload, because it will sometimes be ambiguous.
500 // - We can't templatize and deduce the parameter. Some compilers will deduce
501 // int for NULL, and then refuse to convert NULL to an int.
503 // We know in this case that the value is 0, so there's no need to capture the
504 // value. We also know it's a fundamental type, so it's safe to pass to "...".
505 // (It's illegal to pass non-POD types to ...).
506 static NullLiteralComparisonHelper
WrapValue(...) {
507 return NullLiteralComparisonHelper();
511 // IS_NULL_LITERAL(type) is a little template metaprogramming for determining
512 // if a type is a null or zero literal (NULL or 0 or a constant that evaluates
514 // The idea is that for NULL or 0, any pointer type is always a better match
515 // than "...". But no other pointer types or literals should convert
516 // automatically to InternalDummyClass.
517 struct InternalDummyClass
{};
518 char TestNullLiteral(const InternalDummyClass
*);
519 struct BiggerThanChar
{ char dummy
[2]; };
520 BiggerThanChar
TestNullLiteral(...);
521 // If the compiler chooses the overload of TestNullLiteral which returns char,
522 // then we know the value converts automatically to InternalDummyClass*, which
523 // should only be true of NULL and 0 constants.
524 #define IS_NULL_LITERAL(a) sizeof(internal::TestNullLiteral(a)) == sizeof(char)
526 template <class T
, class U
>
527 static std::string
MakeBinaryComparisonFailureMessage(
528 const char* comparator
,
531 const char* left_precompiler_string
,
532 const char* right_precompiler_string
,
533 const char* file_name
,
535 std::string error_msg
=
536 std::string("Failed ASSERT_") + comparator
+ "(" +
537 left_precompiler_string
+ ", " + right_precompiler_string
+ ")";
538 std::string
left_string(left
.ToString());
539 std::string
right_string(ToString(right
));
540 if (!left_string
.empty())
541 error_msg
+= " Left: (" + left_string
+ ")";
543 if (!right_string
.empty())
544 error_msg
+= " Right: (" + right_string
+ ")";
546 return TestCase::MakeFailureMessage(file_name
, line_number
,
550 // The Comparison function templates allow us to pass the parameter for
551 // ASSERT macros below and have them be evaluated only once. This is important
552 // for cases where the parameter might be an expression with side-effects, like
554 #define DEFINE_COMPARE_FUNCTION(comparator_name) \
555 template <class T, class U> \
556 std::string Compare ## comparator_name ( \
559 const char* left_precompiler_string, \
560 const char* right_precompiler_string, \
561 const char* file_name, \
563 if (!(left.Compare##comparator_name(right))) { \
564 return MakeBinaryComparisonFailureMessage(#comparator_name, \
567 left_precompiler_string, \
568 right_precompiler_string, \
572 return std::string(); \
574 DEFINE_COMPARE_FUNCTION(EQ
)
575 DEFINE_COMPARE_FUNCTION(NE
)
576 DEFINE_COMPARE_FUNCTION(LT
)
577 DEFINE_COMPARE_FUNCTION(LE
)
578 DEFINE_COMPARE_FUNCTION(GT
)
579 DEFINE_COMPARE_FUNCTION(GE
)
580 #undef DEFINE_COMPARE_FUNCTION
581 inline std::string
CompareDoubleEq(ComparisonHelper
<double> left
,
583 const char* left_precompiler_string
,
584 const char* right_precompiler_string
,
585 const char* file_name
,
587 if (!(std::fabs(left
.value
- right
) <=
588 std::numeric_limits
<double>::epsilon())) {
589 return MakeBinaryComparisonFailureMessage(
590 "~=", left
, right
, left_precompiler_string
, right_precompiler_string
,
593 return std::string();
596 } // namespace internal
598 // Use the REGISTER_TEST_CASE macro in your TestCase implementation file to
599 // register your TestCase. If your test is named TestFoo, then add the
600 // following to test_foo.cc:
602 // REGISTER_TEST_CASE(Foo);
604 // This will cause your test to be included in the set of known tests.
606 #define REGISTER_TEST_CASE(name) \
607 static TestCase* Test##name##_FactoryMethod(TestingInstance* instance) { \
608 return new Test##name(instance); \
610 static TestCaseFactory g_Test##name_factory( \
611 #name, &Test##name##_FactoryMethod \
614 // Helper macro for calling functions implementing specific tests in the
615 // RunTest function. This assumes the function name is TestFoo where Foo is the
617 #define RUN_TEST(name, test_filter) \
618 if (ShouldRunTest(#name, test_filter)) { \
619 set_callback_type(PP_OPTIONAL); \
620 PP_TimeTicks start_time(NowInTimeTicks()); \
621 instance_->LogTest(#name, \
622 CheckResourcesAndVars(Test##name()), \
626 // Like RUN_TEST above but forces functions taking callbacks to complete
627 // asynchronously on success or error.
628 #define RUN_TEST_FORCEASYNC(name, test_filter) \
629 if (ShouldRunTest(#name, test_filter)) { \
630 set_callback_type(PP_REQUIRED); \
631 PP_TimeTicks start_time(NowInTimeTicks()); \
632 instance_->LogTest(#name"ForceAsync", \
633 CheckResourcesAndVars(Test##name()), \
637 #define RUN_TEST_BLOCKING(test_case, name, test_filter) \
638 if (ShouldRunTest(#name, test_filter)) { \
639 set_callback_type(PP_BLOCKING); \
640 PP_TimeTicks start_time(NowInTimeTicks()); \
641 instance_->LogTest( \
643 CheckResourcesAndVars(RunOnThread(&test_case::Test##name)), \
647 #define RUN_TEST_BACKGROUND(test_case, name, test_filter) \
648 if (ShouldRunTest(#name, test_filter)) { \
649 PP_TimeTicks start_time(NowInTimeTicks()); \
650 instance_->LogTest( \
652 CheckResourcesAndVars(RunOnThread(&test_case::Test##name)), \
656 #define RUN_TEST_FORCEASYNC_AND_NOT(name, test_filter) \
658 RUN_TEST_FORCEASYNC(name, test_filter); \
659 RUN_TEST(name, test_filter); \
662 // Run a test with all possible callback types.
663 #define RUN_CALLBACK_TEST(test_case, name, test_filter) \
665 RUN_TEST_FORCEASYNC(name, test_filter); \
666 RUN_TEST(name, test_filter); \
667 RUN_TEST_BLOCKING(test_case, name, test_filter); \
668 RUN_TEST_BACKGROUND(test_case, name, test_filter); \
671 #define RUN_TEST_WITH_REFERENCE_CHECK(name, test_filter) \
672 if (ShouldRunTest(#name, test_filter)) { \
673 set_callback_type(PP_OPTIONAL); \
674 uint32_t objects = testing_interface_->GetLiveObjectsForInstance( \
675 instance_->pp_instance()); \
676 std::string error_message = Test##name(); \
677 if (error_message.empty() && \
678 testing_interface_->GetLiveObjectsForInstance( \
679 instance_->pp_instance()) != objects) \
680 error_message = MakeFailureMessage(__FILE__, __LINE__, \
681 "reference leak check"); \
682 PP_TimeTicks start_time(NowInTimeTicks()); \
683 instance_->LogTest(#name, \
684 CheckResourcesAndVars(error_message), \
687 // TODO(dmichael): Add CheckResourcesAndVars above when Windows tests pass
688 // cleanly. crbug.com/173503
690 // Helper macros for checking values in tests, and returning a location
691 // description of the test fails.
692 #define ASSERT_TRUE(cmd) \
695 return MakeFailureMessage(__FILE__, __LINE__, #cmd); \
697 #define ASSERT_FALSE(cmd) ASSERT_TRUE(!(cmd))
698 #define COMPARE_BINARY_INTERNAL(comparison_type, a, b) \
699 internal::Compare##comparison_type( \
700 internal::ParameterWrapper<IS_NULL_LITERAL(a)>::WrapValue(a), \
706 #define ASSERT_BINARY_INTERNAL(comparison_type, a, b) \
708 std::string internal_assert_result_string = \
709 COMPARE_BINARY_INTERNAL(comparison_type, a, b); \
710 if (!internal_assert_result_string.empty()) { \
711 return internal_assert_result_string; \
714 #define ASSERT_EQ(a, b) ASSERT_BINARY_INTERNAL(EQ, a, b)
715 #define ASSERT_NE(a, b) ASSERT_BINARY_INTERNAL(NE, a, b)
716 #define ASSERT_LT(a, b) ASSERT_BINARY_INTERNAL(LT, a, b)
717 #define ASSERT_LE(a, b) ASSERT_BINARY_INTERNAL(LE, a, b)
718 #define ASSERT_GT(a, b) ASSERT_BINARY_INTERNAL(GT, a, b)
719 #define ASSERT_GE(a, b) ASSERT_BINARY_INTERNAL(GE, a, b)
720 #define ASSERT_DOUBLE_EQ(a, b) \
722 std::string internal_assert_result_string = \
723 internal::CompareDoubleEq( \
724 internal::ParameterWrapper<IS_NULL_LITERAL(a)>::WrapValue(a), \
730 if (!internal_assert_result_string.empty()) { \
731 return internal_assert_result_string; \
734 // Runs |function| as a subtest and asserts that it has passed.
735 #define ASSERT_SUBTEST_SUCCESS(function) \
737 std::string result = (function); \
738 if (!result.empty()) \
739 return TestCase::MakeFailureMessage(__FILE__, __LINE__, result.c_str()); \
742 #define PASS() return std::string()
744 #endif // PPAPI_TESTS_TEST_CASE_H_