This is an automated email from the ASF dual-hosted git repository. scw00 pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/trafficserver.git
The following commit(s) were added to refs/heads/master by this push: new ee0ce71 Adds update header only test case ee0ce71 is described below commit ee0ce71fed73ae5092da12ced4e11556ecaced36 Author: scw00 <sc...@apache.org> AuthorDate: Sat May 4 08:17:04 2019 +0000 Adds update header only test case --- iocore/cache/Makefile.am | 10 +- iocore/cache/test/test_Update_header.cc | 185 ++++++++++++++++++++++++++++++++ 2 files changed, 194 insertions(+), 1 deletion(-) diff --git a/iocore/cache/Makefile.am b/iocore/cache/Makefile.am index b2161f0..e9c9df3 100644 --- a/iocore/cache/Makefile.am +++ b/iocore/cache/Makefile.am @@ -128,7 +128,8 @@ check_PROGRAMS = \ test_Alternate_S_to_L_remove_S \ test_Alternate_S_to_L_remove_L \ test_Update_L_to_S \ - test_Update_S_to_L + test_Update_S_to_L \ + test_Update_header test_main_SOURCES = \ ./test/main.cc \ @@ -205,6 +206,13 @@ test_Update_S_to_L_SOURCES = \ $(test_main_SOURCES) \ ./test/test_Update_S_to_L.cc +test_Update_header_CPPFLAGS = $(test_CPPFLAGS) +test_Update_header_LDFLAGS = @AM_LDFLAGS@ +test_Update_header_LDADD = $(test_LDADD) +test_Update_header_SOURCES = \ + $(test_main_SOURCES) \ + ./test/test_Update_header.cc + include $(top_srcdir)/build/tidy.mk clang-tidy-local: $(DIST_SOURCES) diff --git a/iocore/cache/test/test_Update_header.cc b/iocore/cache/test/test_Update_header.cc new file mode 100644 index 0000000..7a69adb --- /dev/null +++ b/iocore/cache/test/test_Update_header.cc @@ -0,0 +1,185 @@ +/** @file + + A brief file description + + @section license License + + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ + +#define LARGE_FILE 10 * 1024 * 1024 +#define SMALL_FILE 10 * 1024 + +#include "main.h" + +class CacheUpdateReadAgain : public CacheTestHandler +{ +public: + CacheUpdateReadAgain(size_t size, const char *url) : CacheTestHandler() + { + auto rt = new CacheReadTest(size, this, url); + rt->mutex = this->mutex; + + rt->info.destroy(); + rt->info.create(); + build_hdrs(rt->info, url, "application/x-javascript"); + + this->_rt = rt; + + SET_HANDLER(&CacheUpdateReadAgain::start_test); + } + + int + start_test(int event, void *e) + { + REQUIRE(event == EVENT_IMMEDIATE); + this_ethread()->schedule_imm(this->_rt); + return 0; + } + + virtual void + handle_cache_event(int event, CacheTestBase *base) + { + switch (event) { + case CACHE_EVENT_OPEN_READ: + base->do_io_read(); + this->validate_content_type(base); + this->check_fragment_table(base); + break; + case VC_EVENT_READ_READY: + base->reenable(); + break; + case VC_EVENT_READ_COMPLETE: + base->close(); + delete this; + break; + default: + REQUIRE(false); + break; + } + } + + void + validate_content_type(CacheTestBase *base) + { + auto rt = dynamic_cast<CacheReadTest *>(base); + REQUIRE(rt); + MIMEField *field = rt->read_http_info->m_alt->m_response_hdr.field_find(MIME_FIELD_CONTENT_TYPE, MIME_LEN_CONTENT_TYPE); + REQUIRE(field); + int len; + const char *value = field->value_get(&len); + REQUIRE(memcmp(value, "application/x-javascript", len) == 0); + } + + void + check_fragment_table(CacheTestBase *base) + { + REQUIRE(base->vc->alternate.get_frag_table() != nullptr); + REQUIRE(base->vc->alternate.get_frag_offset_count() != 0); + } +}; + +class CacheUpdateHeader : public CacheTestHandler +{ +public: + CacheUpdateHeader(size_t read_size, const char *url) + { + auto rt = new CacheReadTest(read_size, this, url); + auto wt = new CacheWriteTest(read_size, this, url); + + wt->info.destroy(); + wt->info.create(); + build_hdrs(wt->info, url, "application/x-javascript"); + + this->_rt = rt; + this->_wt = wt; + + this->_rt->mutex = this->mutex; + this->_wt->mutex = this->mutex; + + SET_HANDLER(&CacheUpdateHeader::start_test); + } + + int + start_test(int event, void *e) + { + REQUIRE(event == EVENT_IMMEDIATE); + this_ethread()->schedule_imm(this->_rt); + return 0; + } + + virtual void + handle_cache_event(int event, CacheTestBase *base) + { + CacheWriteTest *wt = static_cast<CacheWriteTest *>(this->_wt); + switch (event) { + case CACHE_EVENT_OPEN_WRITE: + base->do_io_write(); + // commit the header change + this->_wt->close(); + this->_wt = nullptr; + delete this; + break; + case CACHE_EVENT_OPEN_READ: + base->do_io_read(); + wt->old_info.copy(static_cast<HTTPInfo *>(&base->vc->alternate)); + break; + case VC_EVENT_READ_READY: + base->reenable(); + break; + case VC_EVENT_READ_COMPLETE: + this->_rt->close(); + this->_rt = nullptr; + this_ethread()->schedule_imm(this->_wt); + break; + default: + REQUIRE(false); + break; + } + } +}; + +class CacheUpdateInit : public CacheInit +{ +public: + CacheUpdateInit() {} + int + cache_init_success_callback(int event, void *e) override + { + CacheTestHandler *h = new CacheTestHandler(LARGE_FILE, "http://www.scw11.com"); + CacheUpdateHeader *update = new CacheUpdateHeader(LARGE_FILE, "http://www.scw11.com"); + CacheUpdateReadAgain *read = new CacheUpdateReadAgain(LARGE_FILE, "http://www.scw11.com"); + TerminalTest *tt = new TerminalTest; + + h->add(update); + h->add(read); // read again + h->add(tt); + this_ethread()->schedule_imm(h); + delete this; + return 0; + } +}; + +TEST_CASE("cache write -> read", "cache") +{ + init_cache(256 * 1024 * 1024); + // large write test + CacheUpdateInit *init = new CacheUpdateInit; + + this_ethread()->schedule_imm(init); + this_thread()->execute(); +}