text: '''
  '''
  #  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 = '''
  Test compress plugin
  '''
  
  # This test case is very bare-bones.  It only covers a few scenarios that have caused problems.
  
  # Skip if plugins not present.
  #
  Test.SkipUnless(
      Condition.PluginExists('compress.so'),
      Condition.PluginExists('conf_remap.so'),
      Condition.HasATSFeature('TS_HAS_BROTLI')
  )
  
  server = Test.MakeOriginServer("server", options={'--load': '{}/compress_observer.py'.format(Test.TestDirectory)})
  
  
  def repeat(str, count):
      result = ""
      while count > 0:
          result += str
          count -= 1
      return result
  
  
  # Need a fairly big body, otherwise the plugin will refuse to compress
  body = repeat("lets go surfin now everybodys learnin how\n", 24)
  body = body + "lets go surfin now everybodys learnin how"
  
  # expected response from the origin server
  response_header = {
      "headers": "HTTP/1.1 200 OK\r\nConnection: close\r\n" +
      'Etag: "359670651"\r\n' +
      "Cache-Control: public, max-age=31536000\r\n" +
      "Accept-Ranges: bytes\r\n" +
      "Content-Type: text/javascript\r\n" +
      "\r\n",
      "timestamp": "1469733493.993",
      "body": body
  }
  for i in range(3):
      # add request/response to the server dictionary
      request_header = {
          "headers": "GET /obj{} HTTP/1.1\r\nHost: just.any.thing\r\n\r\n".format(i), "timestamp": "1469733493.993", "body": ""
      }
      server.addResponse("sessionfile.log", request_header, response_header)
  
  
  def curl(ts, idx, encodingList):
      return (
          "curl --verbose --proxy http://127.0.0.1:{}".format(ts.Variables.port) +
          " --header 'X-Ats-Compress-Test: {}/{}'".format(idx, encodingList) +
          " --header 'Accept-Encoding: {0}' 'http://ae-{1}/obj{1}'".format(encodingList, idx) +
          " 2>> compress_long.log ; printf '\n===\n' >> compress_long.log"
      )
  
  
  waitForServer = True
  
  waitForTs = True
  
  ts = Test.MakeATSProcess("ts", enable_cache=False)
  
  ts.Disk.records_config.update({
      'proxy.config.diags.debug.enabled': 1,
      'proxy.config.diags.debug.tags': 'compress',
      'proxy.config.http.normalize_ae': 0,
  })
  
  ts.Disk.remap_config.AddLine(
      'map http://ae-0/ http://127.0.0.1:{}/'.format(server.Variables.Port) +
      ' @plugin=compress.so @pparam={}/compress.config'.format(Test.TestDirectory)
  )
  ts.Disk.remap_config.AddLine(
      'map http://ae-1/ http://127.0.0.1:{}/'.format(server.Variables.Port) +
      ' @plugin=conf_remap.so @pparam=proxy.config.http.normalize_ae=1' +
      ' @plugin=compress.so @pparam={}/compress.config'.format(Test.TestDirectory)
  )
  ts.Disk.remap_config.AddLine(
      'map http://ae-2/ http://127.0.0.1:{}/'.format(server.Variables.Port) +
      ' @plugin=conf_remap.so @pparam=proxy.config.http.normalize_ae=2' +
      ' @plugin=compress.so @pparam={}/compress2.config'.format(Test.TestDirectory)
  )
  
  for i in range(3):
  
      tr = Test.AddTestRun()
      if (waitForTs):
          tr.Processes.Default.StartBefore(ts)
      waitForTs = False
      if (waitForServer):
          tr.Processes.Default.StartBefore(server, ready=When.PortOpen(server.Variables.Port))
      waitForServer = False
      tr.Processes.Default.ReturnCode = 0
      tr.Processes.Default.Command = curl(ts, i, 'gzip, deflate, sdch, br')
  
      tr = Test.AddTestRun()
      tr.Processes.Default.ReturnCode = 0
      tr.Processes.Default.Command = curl(ts, i, "gzip")
  
      tr = Test.AddTestRun()
      tr.Processes.Default.ReturnCode = 0
      tr.Processes.Default.Command = curl(ts, i, "br")
  
      tr = Test.AddTestRun()
      tr.Processes.Default.ReturnCode = 0
      tr.Processes.Default.Command = curl(ts, i, "deflate")
  
  # Test Aceept-Encoding normalization.
  
  tr = Test.AddTestRun()
  tr.Processes.Default.ReturnCode = 0
  tr.Processes.Default.Command = curl(ts, 0, "gzip;q=0.666")
  
  tr = Test.AddTestRun()
  tr.Processes.Default.ReturnCode = 0
  tr.Processes.Default.Command = curl(ts, 0, "gzip;q=0.666x")
  
  tr = Test.AddTestRun()
  tr.Processes.Default.ReturnCode = 0
  tr.Processes.Default.Command = curl(ts, 0, "gzip;q=#0.666")
  
  tr = Test.AddTestRun()
  tr.Processes.Default.ReturnCode = 0
  tr.Processes.Default.Command = curl(ts, 0, "gzip; Q = 0.666")
  
  tr = Test.AddTestRun()
  tr.Processes.Default.ReturnCode = 0
  tr.Processes.Default.Command = curl(ts, 0, "gzip;q=0.0")
  
  tr = Test.AddTestRun()
  tr.Processes.Default.ReturnCode = 0
  tr.Processes.Default.Command = curl(ts, 0, "gzip;q=-0.1")
  
  tr = Test.AddTestRun()
  tr.Processes.Default.ReturnCode = 0
  tr.Processes.Default.Command = curl(ts, 0, "aaa, gzip;q=0.666, bbb")
  
  tr = Test.AddTestRun()
  tr.Processes.Default.ReturnCode = 0
  tr.Processes.Default.Command = curl(ts, 0, " br ; q=0.666, bbb")
  
  tr = Test.AddTestRun()
  tr.Processes.Default.ReturnCode = 0
  tr.Processes.Default.Command = curl(ts, 0, "aaa, gzip;q=0.666 , ")
  
  # compress_long.log contains all the output from the curl commands.  The tr removes the carriage returns for easier
  # readability.  Curl seems to have a bug, where it will neglect to output an end of line before outputing an HTTP
  # message header line.  The sed command is a work-around for this problem.  greplog.sh uses the grep command to
  # select HTTP request/response line that should be consitent every time the test runs.
  #
  tr = Test.AddTestRun()
  tr.Processes.Default.ReturnCode = 0
  tr.Processes.Default.Command = (
      r"tr -d '\r' < compress_long.log | sed 's/\(..*\)\([<>]\)/\1\n\2/' | {0}/greplog.sh > compress_short.log"
  ).format(Test.TestDirectory)
  f = tr.Disk.File("compress_short.log")
  f.Content = "compress.gold"
  
  tr = Test.AddTestRun()
  tr.Processes.Default.Command = "echo"
  f = tr.Disk.File("compress_userver.log")
  f.Content = "compress_userver.gold"
  