22 #ifndef NET_INSTAWEB_REWRITER_PUBLIC_REWRITE_CONTEXT_TEST_BASE_H_
23 #define NET_INSTAWEB_REWRITER_PUBLIC_REWRITE_CONTEXT_TEST_BASE_H_
30 #include "net/instaweb/rewriter/cached_result.pb.h"
43 #include "pagespeed/kernel/base/basictypes.h"
44 #include "pagespeed/kernel/base/message_handler.h"
45 #include "pagespeed/kernel/base/scoped_ptr.h"
46 #include "pagespeed/kernel/base/string.h"
47 #include "pagespeed/kernel/base/string_util.h"
48 #include "pagespeed/kernel/base/timer.h"
49 #include "pagespeed/kernel/base/writer.h"
50 #include "pagespeed/kernel/html/html_element.h"
51 #include "pagespeed/kernel/html/html_name.h"
52 #include "pagespeed/kernel/html/html_parse_test_base.h"
53 #include "pagespeed/kernel/http/content_type.h"
54 #include "pagespeed/kernel/thread/worker_test_base.h"
55 #include "pagespeed/kernel/util/url_multipart_encoder.h"
56 #include "pagespeed/kernel/util/url_segment_encoder.h"
59 namespace net_instaweb {
66 static const char kFilterId[];
74 void ClearStats() { num_rewrites_ = 0; }
77 REFCOUNT_FRIEND_DECLARATION(TrimWhitespaceRewriter);
78 virtual ~TrimWhitespaceRewriter();
80 virtual bool RewriteText(
const StringPiece& url,
const StringPiece& in,
82 ServerContext* server_context);
83 virtual HtmlElement::Attribute* FindResourceAttribute(HtmlElement* element);
85 virtual const char* id()
const {
return kFilterId; }
86 virtual const char* name()
const {
return "TrimWhitespace"; }
102 static const char kFilterId[];
110 virtual void StartElementImpl(HtmlElement* element);
111 virtual const char* id()
const {
return kFilterId; }
112 virtual const char* name()
const {
return "TrimWhitespaceSync"; }
121 static const char kFilterId[];
124 : kind_(kind), num_rewrites_(0) {}
132 int num_rewrites()
const {
return num_rewrites_; }
133 void ClearStats() { num_rewrites_ = 0; }
139 virtual bool RewriteText(
const StringPiece& url,
const StringPiece& in,
143 in.CopyToString(out);
147 virtual HtmlElement::Attribute* FindResourceAttribute(HtmlElement* element) {
148 if (element->keyword() == HtmlName::kLink) {
149 return element->FindAttribute(HtmlName::kHref);
154 virtual const char* id()
const {
return kFilterId; }
155 virtual const char* name()
const {
return "UpperCase"; }
170 static const bool kExpectNestedRewritesFail =
false;
172 static const char kFilterId[];
177 upper_rewriter_(upper_rewriter), chain_(false),
178 check_nested_rewrite_result_(true),
179 expected_nested_rewrite_result_(expected_nested_result) {
185 int num_sub_rewrites()
const {
return upper_rewriter_->num_rewrites(); }
188 num_top_rewrites_ = 0;
189 upper_rewriter_->ClearStats();
195 bool expected_nested_rewrite_result()
const {
196 return expected_nested_rewrite_result_;
199 void set_expected_nested_rewrite_result(
bool x) {
200 expected_nested_rewrite_result_ = x;
203 void set_check_nested_rewrite_result(
bool x) {
204 check_nested_rewrite_result_ = x;
208 virtual ~NestedFilter();
213 virtual HtmlElement*
element()
const {
return NULL; }
227 const ResourcePtr& input,
const OutputResourcePtr& output);
231 virtual const char*
id()
const {
return kFilterId; }
235 std::vector<GoogleString*> strings_;
238 ResourceSlotVector nested_slots_;
244 return new Context(driver(),
this, chain_);
247 virtual void StartElementImpl(HtmlElement* element);
250 virtual const char* id()
const {
return kFilterId; }
251 virtual const char* Name()
const {
return "NestedFilter"; }
253 virtual void EndElementImpl(HtmlElement* element) {}
257 SimpleTextFilter* upper_filter_;
258 UpperCaseRewriter* upper_rewriter_;
262 bool check_nested_rewrite_result_;
264 bool expected_nested_rewrite_result_;
267 int num_top_rewrites_;
278 static const char kFilterId[];
281 MockScheduler* scheduler,
282 int64 rewrite_delay_ms);
289 driver, kContentTypeCss.file_extension() + 1, filter) {
291 OutputResourcePtr MakeOutput() {
292 return Combine(rewrite_driver_->message_handler());
294 bool Write(
const ResourceVector& in,
const OutputResourcePtr& out) {
300 Writer* writer, MessageHandler* handler) {
301 writer->Write(prefix_, handler);
303 index, num_pieces, input, combination, writer, handler);
306 void set_prefix(
const GoogleString& prefix) { prefix_ = prefix; }
309 virtual const ContentType* CombinationContentType() {
310 return &kContentTypeCss;
313 GoogleString prefix_;
316 virtual const char* id()
const {
return kFilterId; }
321 MockScheduler* scheduler);
323 void AddElement(HtmlElement* element, HtmlElement::Attribute* href,
324 const ResourcePtr& resource) {
325 ResourceSlotPtr slot(Driver()->GetSlot(resource, element, href));
330 virtual bool Partition(OutputPartitions* partitions,
331 OutputResourceVector* outputs);
333 virtual void Rewrite(
int partition_index,
334 CachedResult* partition,
335 const OutputResourcePtr& output);
337 return filter_->optimization_only();
340 void DoRewrite(
int partition_index,
341 CachedResult* partition,
342 OutputResourcePtr output);
346 void DisableRemovedSlots(CachedResult* partition);
347 virtual const UrlSegmentEncoder*
encoder()
const {
return &encoder_; }
348 virtual const char*
id()
const {
return kFilterId; }
355 UrlMultipartEncoder encoder_;
356 MockScheduler* scheduler_;
357 int64 time_at_start_of_rewrite_us_;
362 virtual void StartElementImpl(HtmlElement* element);
363 virtual void Flush() {
364 if (context_.get() != NULL) {
369 virtual void EndElementImpl(HtmlElement* element) {}
370 virtual const char* Name()
const {
return "Combining"; }
372 return new Context(driver(),
this, scheduler_);
374 virtual const UrlSegmentEncoder*
encoder()
const {
return &encoder_; }
378 int num_rewrites()
const {
return num_rewrites_; }
379 int num_render()
const {
return num_render_; }
380 int num_will_not_render()
const {
return num_will_not_render_; }
381 int num_cancel()
const {
return num_cancel_; }
383 void ClearStats() { num_rewrites_ = 0; }
384 int64 rewrite_delay_ms()
const {
return rewrite_delay_ms_; }
385 void set_rewrite_block_on(WorkerTestBase::SyncPoint* sync) {
386 rewrite_block_on_ = sync;
389 void set_rewrite_signal_on(WorkerTestBase::SyncPoint* sync) {
390 rewrite_signal_on_ = sync;
394 void set_prefix(
const GoogleString& prefix) { prefix_ = prefix; }
396 void set_on_the_fly(
bool v) { on_the_fly_ = v; }
398 void set_disable_successors(
bool v) { disable_successors_ = v; }
400 bool optimization_only()
const {
return optimization_only_; }
401 void set_optimization_only(
bool o) { optimization_only_ = o; }
404 friend class Context;
406 scoped_ptr<Context> context_;
407 UrlMultipartEncoder encoder_;
408 MockScheduler* scheduler_;
411 int num_will_not_render_;
413 int64 rewrite_delay_ms_;
417 WorkerTestBase::SyncPoint* rewrite_block_on_;
422 WorkerTestBase::SyncPoint* rewrite_signal_on_;
423 GoogleString prefix_;
425 bool optimization_only_;
426 bool disable_successors_;
435 static const int64 kRewriteDeadlineMs = 20;
447 return StrCat(
"max-age=", Integer64ToString(
452 std::pair<TestRewriteDriverFactory*, TestRewriteDriverFactory*> factories)
454 RewriteContextTestBase() {}
455 virtual ~RewriteContextTestBase();
457 virtual void SetUp();
458 virtual void TearDown();
459 virtual bool AddBody()
const {
return false; }
460 virtual void ClearStats();
462 void InitResources() { InitResourcesToDomain(kTestDomain); }
463 void InitResourcesToDomain(
const char* domain);
466 void InitCombiningFilter(int64 rewrite_delay_ms);
467 void InitNestedFilter(
bool expected_nested_rewrite_result);
469 TrimWhitespaceRewriter* trim_filter_;
470 TrimWhitespaceRewriter* other_trim_filter_;
471 CombiningFilter* combining_filter_;
472 NestedFilter* nested_filter_;
virtual bool WritePiece(int index, int num_pieces, const Resource *input, OutputResource *combination, Writer *writer, MessageHandler *handler)
Definition: rewrite_context_test_base.h:298
virtual OutputResourceKind kind() const
Definition: rewrite_context_test_base.h:232
virtual const UrlSegmentEncoder * encoder() const
Definition: rewrite_context_test_base.h:347
Definition: rewrite_context_test_base.h:210
virtual bool WritePiece(int index, int num_pieces, const Resource *input, OutputResource *combination, Writer *writer, MessageHandler *handler)
virtual GoogleString LocationString() const
Definition: rewrite_context_test_base.h:215
SingleRewriteContext(RewriteDriver *driver, RewriteContext *parent, ResourceContext *resource_context)
Definition: rewrite_context_test_base.h:285
ResourceCombiner(RewriteDriver *rewrite_driver, const StringPiece &extension, RewriteFilter *filter)
Note: extension should not include the leading dot here.
virtual bool ComputeOnTheFly() const
Definition: rewrite_context_test_base.h:376
Definition: rewrite_test_base.h:91
virtual RewriteContext * MakeRewriteContext()
Definition: rewrite_context_test_base.h:243
Definition: rewrite_context_test_base.h:276
RewriteDriver * rewrite_driver()
Definition: rewrite_test_base.h:519
virtual void StartDocumentImpl()
Definition: rewrite_context_test_base.h:361
Definition: resource_slot.h:53
Definition: output_resource_kind.h:28
Definition: simple_text_filter.h:46
Definition: rewrite_context_test_base.h:100
virtual void Rewrite(int partition_index, CachedResult *partition, const OutputResourcePtr &output)
Definition: resource.h:57
A similarly structured test-filter: this one just upper-cases its text.
Definition: rewrite_context_test_base.h:119
static const int64 kOriginTtlMs
Definition: rewrite_context_test_base.h:439
static const int64 kLowOriginTtlMs
Definition: rewrite_context_test_base.h:442
virtual const char * id() const
Returns the filter ID.
Definition: rewrite_context_test_base.h:348
virtual bool Partition(OutputPartitions *partitions, OutputResourceVector *outputs)
virtual void RewriteSingle(const ResourcePtr &input, const OutputResourcePtr &output)
Subclasses of SingleRewriteContext must override this:
virtual bool AddBody() const
Definition: rewrite_context_test_base.h:459
virtual void Render()
Definition: rewrite_context_test_base.h:214
GoogleString OriginTtlMaxAge()
Definition: rewrite_context_test_base.h:446
Definition: rewrite_context_test_base.h:166
void set_chain(bool x)
Set this to true to create a chain of nested rewrites on the same slot.
Definition: rewrite_context_test_base.h:193
int num_rewrites() const
Stats.
Definition: rewrite_context_test_base.h:73
virtual HtmlElement * element() const
Return HTML element associated with slot, or NULL if none (CSS, IPRO)
Definition: rewrite_context_test_base.h:213
Definition: rewrite_filter.h:35
Definition: resource_combiner.h:57
virtual bool WriteCombination(const ResourceVector &combine_resources, const OutputResourcePtr &combination, MessageHandler *handler)
Definition: rewrite_driver.h:98
void set_prefix(const GoogleString &prefix)
Each entry in combination will be prefixed with this.
Definition: rewrite_context_test_base.h:394
Definition: server_context.h:100
Definition: rewrite_context.h:146
virtual bool OptimizationOnly() const
Definition: rewrite_context_test_base.h:336
bool InitiateRewrite(RewriteContext *rewrite_context) LOCKS_EXCLUDED(rewrite_mutex())
Derived from some input resource URL or URLs.
Definition: output_resource_kind.h:27
static const bool kExpectNestedRewritesSucceed
For use with NestedFilter constructor.
Definition: rewrite_context_test_base.h:169
Definition: rewrite_context_test_base.h:218
virtual OutputResourceKind kind() const
Definition: rewrite_context_test_base.h:349
virtual const char * id() const
Returns the filter ID.
Definition: rewrite_context_test_base.h:231
Definition: single_rewrite_context.h:36
Definition: rewrite_context_test_base.h:318
RewriteContext * MakeRewriteContext()
Definition: rewrite_context_test_base.h:371
Definition: rewrite_context_test_base.h:433
Definition: output_resource.h:44
OutputResourcePtr Combine(MessageHandler *handler)
virtual void WillNotRender()
Definition: simple_text_filter.h:48
virtual void StartDocumentImpl()
Definition: rewrite_context_test_base.h:252
int num_top_rewrites() const
Stats.
Definition: rewrite_context_test_base.h:184
virtual const UrlSegmentEncoder * encoder() const
Definition: rewrite_context_test_base.h:374
Simple test filter just trims whitespace from the input resource.
Definition: rewrite_context_test_base.h:64
void AddSlot(const ResourceSlotPtr &slot)
OutputResourceKind
Definition: output_resource_kind.h:26