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/htmlparse/public/html_element.h"
31 #include "net/instaweb/htmlparse/public/html_name.h"
32 #include "net/instaweb/htmlparse/public/html_parse_test_base.h"
49 #include "net/instaweb/util/public/url_multipart_encoder.h"
51 #include "net/instaweb/util/worker_test_base.h"
54 namespace net_instaweb {
59 class OutputPartitions;
61 class TestRewriteDriverFactory;
62 class UrlSegmentEncoder;
67 static const char kFilterId[];
75 void ClearStats() { num_rewrites_ = 0; }
78 REFCOUNT_FRIEND_DECLARATION(TrimWhitespaceRewriter);
79 virtual ~TrimWhitespaceRewriter();
81 virtual bool RewriteText(
const StringPiece& url,
const StringPiece& in,
83 ServerContext* server_context);
84 virtual HtmlElement::Attribute* FindResourceAttribute(HtmlElement* element);
86 virtual const char* id()
const {
return kFilterId; }
87 virtual const char* name()
const {
return "TrimWhitespace"; }
94 DISALLOW_COPY_AND_ASSIGN(TrimWhitespaceRewriter);
103 static const char kFilterId[];
111 virtual void StartElementImpl(HtmlElement* element);
112 virtual const char* id()
const {
return kFilterId; }
113 virtual const char* name()
const {
return "TrimWhitespaceSync"; }
122 static const char kFilterId[];
125 : kind_(kind), num_rewrites_(0) {}
133 int num_rewrites()
const {
return num_rewrites_; }
134 void ClearStats() { num_rewrites_ = 0; }
140 virtual bool RewriteText(
const StringPiece& url,
const StringPiece& in,
144 in.CopyToString(out);
148 virtual HtmlElement::Attribute* FindResourceAttribute(HtmlElement* element) {
149 if (element->keyword() == HtmlName::kLink) {
150 return element->FindAttribute(HtmlName::kHref);
155 virtual const char* id()
const {
return kFilterId; }
156 virtual const char* name()
const {
return "UpperCase"; }
171 static const bool kExpectNestedRewritesFail =
false;
173 static const char kFilterId[];
178 upper_rewriter_(upper_rewriter), chain_(false),
179 check_nested_rewrite_result_(true),
180 expected_nested_rewrite_result_(expected_nested_result) {
186 int num_sub_rewrites()
const {
return upper_rewriter_->num_rewrites(); }
189 num_top_rewrites_ = 0;
190 upper_rewriter_->ClearStats();
196 bool expected_nested_rewrite_result()
const {
197 return expected_nested_rewrite_result_;
200 void set_expected_nested_rewrite_result(
bool x) {
201 expected_nested_rewrite_result_ = x;
204 void set_check_nested_rewrite_result(
bool x) {
205 check_nested_rewrite_result_ = x;
209 virtual ~NestedFilter();
214 virtual HtmlElement*
element()
const {
return NULL; }
228 const ResourcePtr& input,
const OutputResourcePtr& output);
232 virtual const char*
id()
const {
return kFilterId; }
236 std::vector<GoogleString*> strings_;
239 ResourceSlotVector nested_slots_;
241 DISALLOW_COPY_AND_ASSIGN(
Context);
245 return new Context(driver(),
this, chain_);
248 void StartElementImpl(HtmlElement* element);
251 virtual const char* id()
const {
return kFilterId; }
252 virtual const char* Name()
const {
return "NestedFilter"; }
254 virtual void EndElementImpl(HtmlElement* element) {}
258 SimpleTextFilter* upper_filter_;
259 UpperCaseRewriter* upper_rewriter_;
263 bool check_nested_rewrite_result_;
265 bool expected_nested_rewrite_result_;
268 int num_top_rewrites_;
270 DISALLOW_COPY_AND_ASSIGN(NestedFilter);
279 static const char kFilterId[];
282 MockScheduler* scheduler,
283 int64 rewrite_delay_ms);
290 driver, kContentTypeCss.file_extension() + 1, filter) {
292 OutputResourcePtr MakeOutput() {
293 return Combine(rewrite_driver_->message_handler());
295 bool Write(
const ResourceVector& in,
const OutputResourcePtr& out) {
301 Writer* writer, MessageHandler* handler) {
302 writer->Write(prefix_, handler);
304 index, input, combination, writer, handler);
307 void set_prefix(
const GoogleString& prefix) { prefix_ = prefix; }
310 virtual const ContentType* CombinationContentType() {
311 return &kContentTypeCss;
314 GoogleString prefix_;
317 virtual const char* id()
const {
return kFilterId; }
322 MockScheduler* scheduler);
324 void AddElement(HtmlElement* element, HtmlElement::Attribute* href,
325 const ResourcePtr& resource) {
326 ResourceSlotPtr slot(Driver()->GetSlot(resource, element, href));
331 virtual bool Partition(OutputPartitions* partitions,
332 OutputResourceVector* outputs);
334 virtual void Rewrite(
int partition_index,
335 CachedResult* partition,
336 const OutputResourcePtr& output);
338 return filter_->optimization_only();
341 void DoRewrite(
int partition_index,
342 CachedResult* partition,
343 OutputResourcePtr output);
347 void DisableRemovedSlots(CachedResult* partition);
348 virtual const UrlSegmentEncoder*
encoder()
const {
return &encoder_; }
349 virtual const char*
id()
const {
return kFilterId; }
356 UrlMultipartEncoder encoder_;
357 MockScheduler* scheduler_;
358 int64 time_at_start_of_rewrite_us_;
363 virtual void StartElementImpl(HtmlElement* element);
364 virtual void Flush() {
365 if (context_.get() != NULL) {
370 virtual void EndElementImpl(HtmlElement* element) {}
371 virtual const char* Name()
const {
return "Combining"; }
373 return new Context(driver(),
this, scheduler_);
375 virtual const UrlSegmentEncoder*
encoder()
const {
return &encoder_; }
379 int num_rewrites()
const {
return num_rewrites_; }
380 int num_render()
const {
return num_render_; }
381 int num_will_not_render()
const {
return num_will_not_render_; }
382 int num_cancel()
const {
return num_cancel_; }
384 void ClearStats() { num_rewrites_ = 0; }
385 int64 rewrite_delay_ms()
const {
return rewrite_delay_ms_; }
386 void set_rewrite_block_on(WorkerTestBase::SyncPoint* sync) {
387 rewrite_block_on_ = sync;
390 void set_rewrite_signal_on(WorkerTestBase::SyncPoint* sync) {
391 rewrite_signal_on_ = sync;
395 void set_prefix(
const GoogleString& prefix) { prefix_ = prefix; }
397 void set_on_the_fly(
bool v) { on_the_fly_ = v; }
399 void set_disable_successors(
bool v) { disable_successors_ = v; }
401 bool optimization_only()
const {
return optimization_only_; }
402 void set_optimization_only(
bool o) { optimization_only_ = o; }
405 friend class Context;
407 scoped_ptr<Context> context_;
408 UrlMultipartEncoder encoder_;
409 MockScheduler* scheduler_;
412 int num_will_not_render_;
414 int64 rewrite_delay_ms_;
418 WorkerTestBase::SyncPoint* rewrite_block_on_;
423 WorkerTestBase::SyncPoint* rewrite_signal_on_;
424 GoogleString prefix_;
426 bool optimization_only_;
427 bool disable_successors_;
431 DISALLOW_COPY_AND_ASSIGN(CombiningFilter);
436 static const int64 kRewriteDeadlineMs = 20;
448 return StrCat(
"max-age=", Integer64ToString(
453 std::pair<TestRewriteDriverFactory*, TestRewriteDriverFactory*> factories)
455 RewriteContextTestBase() {}
456 virtual ~RewriteContextTestBase();
458 virtual void SetUp();
459 virtual void TearDown();
460 virtual bool AddBody()
const {
return false; }
461 virtual void ClearStats();
463 void InitResources() { InitResourcesToDomain(kTestDomain); }
464 void InitResourcesToDomain(
const char* domain);
467 void InitCombiningFilter(int64 rewrite_delay_ms);
468 void InitNestedFilter(
bool expected_nested_rewrite_result);
470 TrimWhitespaceRewriter* trim_filter_;
471 TrimWhitespaceRewriter* other_trim_filter_;
472 CombiningFilter* combining_filter_;
473 NestedFilter* nested_filter_;
virtual OutputResourceKind kind() const
Definition: rewrite_context_test_base.h:233
virtual const UrlSegmentEncoder * encoder() const
Definition: rewrite_context_test_base.h:348
Definition: rewrite_context_test_base.h:211
SingleRewriteContext(RewriteDriver *driver, RewriteContext *parent, ResourceContext *resource_context)
Definition: rewrite_context_test_base.h:286
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:377
Definition: rewrite_test_base.h:88
Definition: rewrite_context_test_base.h:277
RewriteDriver * rewrite_driver()
Definition: rewrite_test_base.h:504
virtual void StartDocumentImpl()
Definition: rewrite_context_test_base.h:362
Definition: resource_slot.h:53
Definition: output_resource_kind.h:28
Definition: simple_text_filter.h:46
Definition: rewrite_context_test_base.h:101
virtual void Rewrite(int partition_index, CachedResult *partition, const OutputResourcePtr &output)
Definition: resource.h:56
A similarly structured test-filter: this one just upper-cases its text.
Definition: rewrite_context_test_base.h:120
static const int64 kOriginTtlMs
Definition: rewrite_context_test_base.h:440
static const int64 kLowOriginTtlMs
Definition: rewrite_context_test_base.h:443
virtual const char * id() const
Returns the filter ID.
Definition: rewrite_context_test_base.h:349
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:460
virtual void Render()
Definition: rewrite_context_test_base.h:215
GoogleString OriginTtlMaxAge()
Definition: rewrite_context_test_base.h:447
Definition: rewrite_context_test_base.h:167
virtual bool WritePiece(int index, const Resource *input, OutputResource *combination, Writer *writer, MessageHandler *handler)
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:194
int num_rewrites() const
Stats.
Definition: rewrite_context_test_base.h:74
virtual GoogleString LocationString()
Definition: rewrite_context_test_base.h:216
virtual HtmlElement * element() const
Return HTML element associated with slot, or NULL if none (CSS, IPRO)
Definition: rewrite_context_test_base.h:214
Definition: rewrite_filter.h:37
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:395
Definition: server_context.h:100
Definition: rewrite_context.h:144
virtual bool OptimizationOnly() const
Definition: rewrite_context_test_base.h:337
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:170
Definition: rewrite_context_test_base.h:219
virtual OutputResourceKind kind() const
Definition: rewrite_context_test_base.h:350
virtual const char * id() const
Returns the filter ID.
Definition: rewrite_context_test_base.h:232
Definition: single_rewrite_context.h:36
Definition: rewrite_context_test_base.h:319
RewriteContext * MakeRewriteContext()
Definition: rewrite_context_test_base.h:372
Definition: rewrite_context_test_base.h:434
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:253
int num_top_rewrites() const
Stats.
Definition: rewrite_context_test_base.h:185
virtual bool WritePiece(int index, const Resource *input, OutputResource *combination, Writer *writer, MessageHandler *handler)
Definition: rewrite_context_test_base.h:299
virtual const UrlSegmentEncoder * encoder() const
Definition: rewrite_context_test_base.h:375
Simple test filter just trims whitespace from the input resource.
Definition: rewrite_context_test_base.h:65
void AddSlot(const ResourceSlotPtr &slot)
RewriteContext * MakeRewriteContext()
Definition: rewrite_context_test_base.h:244
OutputResourceKind
Definition: output_resource_kind.h:26