1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
|
// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ppapi/tests/test_case.h"
#include <sstream>
#include "ppapi/tests/test_utils.h"
#include "ppapi/tests/testing_instance.h"
TestCase::TestCase(TestingInstance* instance)
: instance_(instance),
testing_interface_(NULL),
force_async_(false) {
// Get the testing_interface_ if it is available, so that we can do Resource
// and Var checks on shutdown (see CheckResourcesAndVars). If it is not
// available, testing_interface_ will be NULL. Some tests do not require it.
testing_interface_ = GetTestingInterface();
}
TestCase::~TestCase() {
}
bool TestCase::Init() {
return true;
}
// static
std::string TestCase::MakeFailureMessage(const char* file,
int line,
const char* cmd) {
// The mere presence of this local variable works around a gcc-4.2.4
// compiler bug in official Chrome Linux builds. If you remove it,
// confirm this compile command still works:
// GYP_DEFINES='branding=Chrome buildtype=Official target_arch=x64'
// gclient runhooks
// make -k -j4 BUILDTYPE=Release ppapi_tests
std::string s;
std::ostringstream output;
output << "Failure in " << file << "(" << line << "): " << cmd;
return output.str();
}
#if !(defined __native_client__)
pp::VarPrivate TestCase::GetTestObject() {
if (test_object_.is_undefined()) {
pp::deprecated::ScriptableObject* so = CreateTestObject();
if (so)
test_object_ = pp::VarPrivate(instance_, so); // Takes ownership.
}
return test_object_;
}
#endif
bool TestCase::CheckTestingInterface() {
testing_interface_ = GetTestingInterface();
if (!testing_interface_) {
// Give a more helpful error message for the testing interface being gone
// since that needs special enabling in Chrome.
instance_->AppendError("This test needs the testing interface, which is "
"not currently available. In Chrome, use "
"--enable-pepper-testing when launching.");
return false;
}
return true;
}
void TestCase::HandleMessage(const pp::Var& message_data) {
}
void TestCase::DidChangeView(const pp::View& view) {
}
bool TestCase::HandleInputEvent(const pp::InputEvent& event) {
return false;
}
#if !(defined __native_client__)
pp::deprecated::ScriptableObject* TestCase::CreateTestObject() {
return NULL;
}
#endif
bool TestCase::EnsureRunningOverHTTP() {
if (instance_->protocol() != "http:") {
instance_->AppendError("This test needs to be run over HTTP.");
return false;
}
return true;
}
bool TestCase::MatchesFilter(const std::string& test_name,
const std::string& filter) {
return filter.empty() || (test_name == filter);
}
std::string TestCase::CheckResourcesAndVars() {
std::string errors;
if (testing_interface_) {
// TODO(dmichael): Fix tests that leak resources and enable the following:
/*
uint32_t leaked_resources =
testing_interface_->GetLiveObjectsForInstance(instance_->pp_instance());
if (leaked_resources) {
std::ostringstream output;
output << "FAILED: Test leaked " << leaked_resources << " resources.\n";
errors += output.str();
}
*/
const uint32_t kVarsToPrint = 10;
PP_Var vars[kVarsToPrint];
uint32_t leaked_vars = testing_interface_->GetLiveVars(vars, kVarsToPrint);
uint32_t tracked_vars = leaked_vars;
#if !(defined __native_client__)
// Don't count test_object_ as a leak.
if (test_object_.pp_var().type > PP_VARTYPE_DOUBLE)
--leaked_vars;
#endif
if (leaked_vars) {
std::ostringstream output;
output << "Test leaked " << leaked_vars << " vars (printing at most "
<< kVarsToPrint <<"):<p>";
errors += output.str();
for (uint32_t i = 0; i < std::min(tracked_vars, kVarsToPrint); ++i) {
pp::Var leaked_var(pp::Var::PassRef(), vars[i]);
#if (defined __native_client__)
errors += leaked_var.DebugString() + "<p>";
#else
if (!(leaked_var == test_object_))
errors += leaked_var.DebugString() + "<p>";
#endif
}
}
}
return errors;
}
|