blob: a99bff794c330a0d80d666b396247212510a459f [file]
'''
'''
# 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.
Test.Summary = '''
Slice plugin error.log test
'''
# Test description:
# Preload the cache with the entire asset to be range requested.
# Reload remap rule with slice plugin
# Request content through the slice plugin
Test.SkipUnless(Condition.PluginExists('slice.so'),)
Test.ContinueOnFail = False
# configure origin server
server = Test.MakeOriginServer("server", lookup_key="{%Range}{PATH}")
# Define ATS and configure
ts = Test.MakeATSProcess("ts", enable_cache=False)
body = "the quick brown fox" # len 19
# default root
request_header_chk = {
"headers": "GET / HTTP/1.1\r\n" + "Host: ats\r\n" + "Range: bytes=0-\r\n" + "\r\n",
"timestamp": "1469733493.993",
"body": "",
}
response_header_chk = {
"headers": "HTTP/1.1 206 Partial Content\r\n" + "Connection: close\r\n" + "\r\n",
"timestamp": "1469733493.993",
"body": body,
}
server.addResponse("sessionlog.json", request_header_chk, response_header_chk)
blockbytes = 9
range0 = "{}-{}".format(0, blockbytes - 1)
range1 = "{}-{}".format(blockbytes, (2 * blockbytes) - 1)
body0 = body[0:blockbytes]
body1 = body[blockbytes:2 * blockbytes]
# Mismatch etag
request_header_etag0 = {
"headers":
"GET /etag HTTP/1.1\r\n" + "Host: ats\r\n" + "Range: bytes={}\r\n".format(range0) +
"X-Slicer-Info: full content request\r\n" + "\r\n",
"timestamp": "1469733493.993",
"body": "",
}
response_header_etag0 = {
"headers":
"HTTP/1.1 206 Partial Content\r\n" + "Connection: close\r\n" + 'Etag: "etag0"\r\n' +
"Content-Range: bytes {}/{}\r\n".format(range0, len(body)) + "Cache-Control: max-age=500\r\n" + "\r\n",
"timestamp": "1469733493.993",
"body": body0,
}
server.addResponse("sessionlog.json", request_header_etag0, response_header_etag0)
request_header_etag1 = {
"headers":
"GET /etag HTTP/1.1\r\n" + "Host: ats\r\n" + "Range: bytes={}\r\n".format(range1) +
"X-Slicer-Info: full content request\r\n" + "\r\n",
"timestamp": "1469733493.993",
"body": "",
}
response_header_etag1 = {
"headers":
"HTTP/1.1 206 Partial Content\r\n" + "Connection: close\r\n" + 'Etag: "etag1"\r\n' +
"Content-Range: bytes {}/{}\r\n".format(range1, len(body)) + "Cache-Control: max-age=500\r\n" + "\r\n",
"timestamp": "1469733493.993",
"body": body1,
}
server.addResponse("sessionlog.json", request_header_etag1, response_header_etag1)
# mismatch Last-Modified
request_header_lm0 = {
"headers":
"GET /lastmodified HTTP/1.1\r\n" + "Host: ats\r\n" + "Range: bytes={}\r\n".format(range0) +
"X-Slicer-Info: full content request\r\n" + "\r\n",
"timestamp": "1469733493.993",
"body": "",
}
response_header_lm0 = {
"headers":
"HTTP/1.1 206 Partial Content\r\n" + "Connection: close\r\n" + "Last-Modified: Tue, 08 May 2018 15:49:41 GMT\r\n" +
"Content-Range: bytes {}/{}\r\n".format(range0, len(body)) + "Cache-Control: max-age=500\r\n" + "\r\n",
"timestamp": "1469733493.993",
"body": body0,
}
server.addResponse("sessionlog.json", request_header_lm0, response_header_lm0)
request_header_lm1 = {
"headers":
"GET /lastmodified HTTP/1.1\r\n" + "Host: ats\r\n" + "Range: bytes={}\r\n".format(range1) +
"X-Slicer-Info: full content request\r\n" + "\r\n",
"timestamp": "1469733493.993",
"body": "",
}
response_header_lm1 = {
"headers":
"HTTP/1.1 206 Partial Content\r\n" + "Connection: close\r\n" + "Last-Modified: Tue, 08 Apr 2019 18:00:00 GMT\r\n" +
"Content-Range: bytes {}/{}\r\n".format(range1, len(body)) + "Cache-Control: max-age=500\r\n" + "\r\n",
"timestamp": "1469733493.993",
"body": body1,
}
server.addResponse("sessionlog.json", request_header_lm1, response_header_lm1)
# non 206 slice block
request_header_n206_0 = {
"headers":
"GET /non206 HTTP/1.1\r\n" + "Host: ats\r\n" + "Range: bytes={}\r\n".format(range0) +
"X-Slicer-Info: full content request\r\n" + "\r\n",
"timestamp": "1469733493.993",
"body": "",
}
response_header_n206_0 = {
"headers":
"HTTP/1.1 206 Partial Content\r\n" + "Connection: close\r\n" + 'Etag: "etag"\r\n' +
"Last-Modified: Tue, 08 May 2018 15:49:41 GMT\r\n" + "Content-Range: bytes {}/{}\r\n".format(range0, len(body)) +
"Cache-Control: max-age=500\r\n" + "\r\n",
"timestamp": "1469733493.993",
"body": body0,
}
server.addResponse("sessionlog.json", request_header_n206_0, response_header_n206_0)
request_header_n206_1 = {
"headers":
"GET /non206 HTTP/1.1\r\n" + "Host: ats\r\n" + "Range: bytes={}\r\n".format(range1) +
"X-Slicer-Info: full content request\r\n" + "\r\n",
"timestamp": "1469733493.993",
"body": "",
}
response_header_n206_1 = {
"headers": "HTTP/1.1 502 Bad Gateway\r\n" + "Connection: close\r\n" + "\r\n",
"timestamp": "1469733493.993",
"body": body1,
}
server.addResponse("sessionlog.json", request_header_n206_1, response_header_n206_1)
# mismatch content-range
request_header_crr0 = {
"headers":
"GET /crr HTTP/1.1\r\n" + "Host: ats\r\n" + "Range: bytes={}\r\n".format(range0) +
"X-Slicer-Info: full content request\r\n" + "\r\n",
"timestamp": "1469733493.993",
"body": "",
}
response_header_crr0 = {
"headers":
"HTTP/1.1 206 Partial Content\r\n" + "Connection: close\r\n" + "Etag: crr\r\n" +
"Content-Range: bytes {}/{}\r\n".format(range0, len(body)) + "Cache-Control: max-age=500\r\n" + "\r\n",
"timestamp": "1469733493.993",
"body": body0,
}
server.addResponse("sessionlog.json", request_header_crr0, response_header_crr0)
request_header_crr1 = {
"headers":
"GET /crr HTTP/1.1\r\n" + "Host: ats\r\n" + "Range: bytes={}\r\n".format(range1) +
"X-Slicer-Info: full content request\r\n" + "\r\n",
"timestamp": "1469733493.993",
"body": "",
}
response_header_crr1 = {
"headers":
"HTTP/1.1 206 Partial Content\r\n" + "Connection: close\r\n" + "Etag: crr\r\n" +
"Content-Range: bytes {}/{}\r\n".format(range1,
len(body) - 1) + "Cache-Control: max-age=500\r\n" + "\r\n",
"timestamp": "1469733493.993",
"body": body1,
}
server.addResponse("sessionlog.json", request_header_crr1, response_header_crr1)
# 404 internal block
request_header_internal404_0 = {
"headers":
"GET /internal404 HTTP/1.1\r\n" + "Host: ats\r\n" + "Range: bytes={}\r\n".format(range0) +
"X-Slicer-Info: full content request\r\n" + "\r\n",
"timestamp": "1469733493.993",
"body": "",
}
response_header_internal404_0 = {
"headers":
"HTTP/1.1 206 Partial Content\r\n" + "Connection: close\r\n" + 'Etag: "etag"\r\n' +
"Last-Modified: Tue, 08 May 2018 15:49:41 GMT\r\n" + "Content-Range: bytes {}/{}\r\n".format(range0, len(body)) +
"Cache-Control: max-age=500\r\n" + "\r\n",
"timestamp": "1469733493.993",
"body": body0,
}
server.addResponse("sessionlog.json", request_header_internal404_0, response_header_internal404_0)
curl_and_args = '-s -D /dev/stdout -o /dev/stderr -x http://127.0.0.1:{}'.format(ts.Variables.port)
# set up whole asset fetch into cache
ts.Disk.remap_config.AddLine(
'map / http://127.0.0.1:{}'.format(server.Variables.Port) + ' @plugin=slice.so @pparam=--blockbytes-test={}'.format(blockbytes))
# minimal configuration
ts.Disk.records_config.update({
# 'proxy.config.diags.debug.enabled': 1,
# 'proxy.config.diags.debug.tags': 'slice',
})
# Override builtin error check as these cases will fail
# taken from the slice plug code
ts.Disk.diags_log.Content = Testers.ContainsExpression('reason="Mismatch block Etag', "Mismatch block etag")
ts.Disk.diags_log.Content += Testers.ContainsExpression('reason="Mismatch block Last-Modified', "Mismatch block Last-Modified")
ts.Disk.diags_log.Content += Testers.ContainsExpression(
'reason="Mismatch/Bad block Content-Range', "Mismatch/Bad block Content-Range")
ts.Disk.diags_log.Content += Testers.ContainsExpression('reason="404 internal block response', "404 internal block response")
# 0 Test - Etag mismatch test
tr = Test.AddTestRun("Etag test")
ps = tr.Processes.Default
ps.StartBefore(server, ready=When.PortOpen(server.Variables.Port))
ps.StartBefore(Test.Processes.ts)
tr.MakeCurlCommand(curl_and_args + ' http://ats/etag', ts=ts)
# ps.ReturnCode = 0 # curl will return fail status
ps.Streams.stdout.Content = Testers.ContainsExpression("200 OK", "expected 200 OK response")
ps.Streams.stderr = "gold_error/contents.stderr.gold"
tr.StillRunningAfter = ts
# 1 Check - diags.log message
tr = Test.AddTestRun("Etag error check")
ps = tr.Processes.Default
ps.Command = "grep 'Mismatch block Etag' {}".format(ts.Disk.diags_log.Name)
ps.ReturnCode = 0
tr.StillRunningAfter = ts
# 2 Test - Last Modified mismatch test
tr = Test.AddTestRun("Last-Modified test")
ps = tr.Processes.Default
tr.MakeCurlCommand(curl_and_args + ' http://ats/lastmodified', ts=ts)
# ps.ReturnCode = 0 # curl will return fail status
ps.Streams.stderr = "gold_error/contents.stderr.gold"
ps.Streams.stdout.Content = Testers.ContainsExpression("200 OK", "expected 200 OK response")
tr.StillRunningAfter = ts
# 3 Check - diags.log message
tr = Test.AddTestRun("Last-Modified error check")
ps = tr.Processes.Default
ps.Command = "grep 'Mismatch block Last-Modified' {}".format(ts.Disk.diags_log.Name)
ps.ReturnCode = 0
tr.StillRunningAfter = ts
# 4 Test - Block content-range
tr = Test.AddTestRun("Content-Range test")
ps = tr.Processes.Default
tr.MakeCurlCommand(curl_and_args + ' http://ats/crr', ts=ts)
# ps.ReturnCode = 0 # curl will return fail status
ps.Streams.stderr = "gold_error/contents.stderr.gold"
ps.Streams.stdout.Content = Testers.ContainsExpression("200 OK", "expected 200 OK response")
tr.StillRunningAfter = ts
# 5 Check - diags.log message
tr = Test.AddTestRun("Content-Range error check")
ps = tr.Processes.Default
ps.Command = "grep 'Mismatch/Bad block Content-Range' {}".format(ts.Disk.diags_log.Name)
ps.ReturnCode = 0
tr.StillRunningAfter = ts
# 6 Test - 404 internal test
tr = Test.AddTestRun("Internal 404 test")
ps = tr.Processes.Default
tr.MakeCurlCommand(curl_and_args + ' http://ats/internal404', ts=ts)
# ps.ReturnCode = 0 # curl will return fail status
ps.Streams.stderr = "gold_error/contents.stderr.gold"
ps.Streams.stdout.Content = Testers.ContainsExpression("200 OK", "expected 200 OK response")
tr.StillRunningAfter = ts
# 7 Check - diags.log message
tr = Test.AddTestRun("Internal 404 check")
ps = tr.Processes.Default
ps.Command = "grep '404 internal block response' {}".format(ts.Disk.diags_log.Name)
ps.ReturnCode = 0
tr.StillRunningAfter = ts