blob: 4dd089161b7cf2474aca3c2da5dae0c4098f61f2 [file] [log] [blame]
/*
* Copyright 2012 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// Author: morlovich@google.com (Maksim Orlovich)
// Unit-tests for ResourceFetch
#include "net/instaweb/rewriter/public/resource_fetch.h"
#include "net/instaweb/http/public/sync_fetcher_adapter_callback.h"
#include "net/instaweb/http/public/wait_url_async_fetcher.h"
#include "net/instaweb/rewriter/public/rewrite_options.h"
#include "net/instaweb/rewriter/public/rewrite_test_base.h"
#include "net/instaweb/rewriter/public/server_context.h"
#include "net/instaweb/rewriter/public/test_rewrite_driver_factory.h"
#include "pagespeed/kernel/base/function.h"
#include "pagespeed/kernel/base/gtest.h"
#include "pagespeed/kernel/base/string.h"
#include "pagespeed/kernel/base/string_util.h"
#include "pagespeed/kernel/base/string_writer.h"
#include "pagespeed/kernel/base/timer.h"
#include "pagespeed/kernel/html/html_parse_test_base.h"
#include "pagespeed/kernel/http/content_type.h"
#include "pagespeed/kernel/http/google_url.h"
#include "pagespeed/kernel/thread/mock_scheduler.h"
namespace net_instaweb {
namespace {
const char kCssContent[] = "* { display: none; }";
const char kMinimizedCssContent[] = "*{display:none}";
class ResourceFetchTest : public RewriteTestBase {
};
TEST_F(ResourceFetchTest, BlockingFetch) {
SetResponseWithDefaultHeaders("a.css", kContentTypeCss, kCssContent, 100);
// Make this actually happen asynchronously.
SetupWaitFetcher();
mock_scheduler()->AddAlarmAtUs(
timer()->NowUs() + 100,
MakeFunction(factory()->wait_url_async_fetcher(),
&WaitUrlAsyncFetcher::CallCallbacks));
// Now fetch stuff.
GoogleString buffer;
StringWriter writer(&buffer);
SyncFetcherAdapterCallback* callback =
new SyncFetcherAdapterCallback(
server_context()->thread_system(), &writer,
CreateRequestContext());
RewriteOptions* custom_options =
server_context()->global_options()->Clone();
RewriteDriver* custom_driver =
server_context()->NewCustomRewriteDriver(
custom_options,
CreateRequestContext());
GoogleUrl url(Encode(kTestDomain, "cf", "0", "a.css", "css"));
EXPECT_TRUE(
ResourceFetch::BlockingFetch(
url, server_context(), custom_driver, callback));
EXPECT_TRUE(callback->IsDone());
EXPECT_TRUE(callback->success());
callback->Release();
EXPECT_EQ(kMinimizedCssContent, buffer);
}
TEST_F(ResourceFetchTest, BlockingFetchOfInvalidUrl) {
// Fetch stuff.
GoogleString buffer;
StringWriter writer(&buffer);
RewriteOptions* custom_options =
server_context()->global_options()->Clone();
custom_options->set_in_place_rewriting_enabled(false);
RewriteDriver* custom_driver =
server_context()->NewCustomRewriteDriver(
custom_options, CreateRequestContext());
SyncFetcherAdapterCallback* callback =
new SyncFetcherAdapterCallback(
server_context()->thread_system(), &writer, CreateRequestContext());
// Encode an URL then invalidate it by removing the hash. This will cause
// RewriteDriver::DecodeOutputResourceNameHelper to reject it, which will
// cause RewriteDriver::FetchResource to fail to handle it, which will cause
// StartWithDriver and then BlockingFetch to exit early.
GoogleUrl url(Encode(kTestDomain, "cf", "deadbeef", "a.css", "css"));
GoogleString url_str;
url.Spec().CopyToString(&url_str);
GlobalReplaceSubstring(".deadbeef.", "..", &url_str);
url.Reset(url_str);
// Prior to StartWithDriver checking if the fetch was actually initiated,
// the call to BlockingFetch would block forever; now it returns immediately.
EXPECT_FALSE(
ResourceFetch::BlockingFetch(
url, server_context(), custom_driver, callback));
EXPECT_TRUE(callback->IsDone());
EXPECT_FALSE(callback->success());
callback->Release();
EXPECT_EQ("", buffer);
}
} // namespace
} // namespace net_instaweb