blob: 21747b84cdc650a70d681f8c9814466eeeecff75 [file] [log] [blame]
/*
* Copyright 2010 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: jmarantz@google.com (Joshua Marantz)
// Author: sligocki@google.com (Shawn Ligocki)
#include "net/instaweb/http/public/http_dump_url_async_writer.h"
#include "net/instaweb/http/public/counting_url_async_fetcher.h"
#include "net/instaweb/http/public/fetcher_test.h"
#include "net/instaweb/http/public/wait_url_async_fetcher.h"
#include "pagespeed/kernel/base/gtest.h"
#include "pagespeed/kernel/base/mem_file_system.h"
#include "pagespeed/kernel/base/mock_timer.h"
#include "pagespeed/kernel/base/null_mutex.h"
#include "pagespeed/kernel/base/scoped_ptr.h"
#include "pagespeed/kernel/base/string.h"
#include "pagespeed/kernel/base/string_util.h"
namespace net_instaweb {
// TODO(sligocki): Merge with CacheUrlAsyncFetcherTest and refactor into
// FetcherTestBase.
class HttpDumpUrlAsyncWriterTest : public FetcherTest {
protected:
HttpDumpUrlAsyncWriterTest()
: root_dir_(GTestTempDir() + "/http_dump_url_async_writer_test/"),
mock_timer_(new NullMutex(), 0),
file_system_(thread_system_.get(), &mock_timer_),
dump_fetcher_(root_dir_, counting_fetcher(), &file_system_,
&mock_timer_) {
}
UrlAsyncFetcher* async_fetcher() { return &dump_fetcher_; }
GoogleString root_dir_;
MockTimer mock_timer_;
MemFileSystem file_system_;
HttpDumpUrlAsyncWriter dump_fetcher_;
};
TEST_F(HttpDumpUrlAsyncWriterTest, TestCacheable) {
// With the async cached fetching interface, we will expect even the
// initial request to succeed, once the callbacks are run.
bool callback_called1, callback_called2, callback_called3;
EXPECT_EQ(1, CountFetchesAsync(kGoodUrl, true, &callback_called1));
EXPECT_FALSE(callback_called1);
EXPECT_EQ(1, CountFetchesAsync(kGoodUrl, true, &callback_called2));
EXPECT_FALSE(callback_called1);
EXPECT_FALSE(callback_called2);
wait_fetcher()->CallCallbacks();
EXPECT_TRUE(callback_called1);
EXPECT_TRUE(callback_called2);
EXPECT_EQ(0, CountFetchesAsync(kGoodUrl, true, &callback_called3));
// No async fetcher callbacks were queued because the content
// was cached, so no need to call CallCallbacks() again here.
EXPECT_TRUE(callback_called3);
}
TEST_F(HttpDumpUrlAsyncWriterTest, TestNotCacheable) {
// With the async cached fetching interface, we will expect even the
// initial request to succeed, once the callbacks are run.
bool callback_called1, callback_called2, callback_called3;
EXPECT_EQ(1, CountFetchesAsync(kNotCachedUrl, true, &callback_called1));
EXPECT_FALSE(callback_called1);
EXPECT_EQ(1, CountFetchesAsync(kNotCachedUrl, true, &callback_called2));
EXPECT_FALSE(callback_called1);
EXPECT_FALSE(callback_called2);
wait_fetcher()->CallCallbacks();
EXPECT_TRUE(callback_called1);
EXPECT_TRUE(callback_called2);
// This is not a proper cache and does not distinguish between cacheable
// or non-cacheable URLs.
EXPECT_EQ(0, CountFetchesAsync(kNotCachedUrl, true, &callback_called3));
EXPECT_TRUE(callback_called3);
}
TEST_F(HttpDumpUrlAsyncWriterTest, TestCacheWithASyncFetcherFail) {
bool callback_called1, callback_called2, callback_called3;
EXPECT_EQ(1, CountFetchesAsync(kBadUrl, false, &callback_called1));
EXPECT_FALSE(callback_called1);
EXPECT_EQ(1, CountFetchesAsync(kBadUrl, false, &callback_called2));
EXPECT_FALSE(callback_called1);
EXPECT_FALSE(callback_called2);
wait_fetcher()->CallCallbacks();
EXPECT_TRUE(callback_called1);
EXPECT_TRUE(callback_called2);
EXPECT_EQ(1, CountFetchesAsync(kBadUrl, false, &callback_called3));
EXPECT_FALSE(callback_called3);
wait_fetcher()->CallCallbacks(); // Otherwise memory will be leaked
EXPECT_TRUE(callback_called3);
}
} // namespace net_instaweb