Add container*Context tests
diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/requestcontext/ContextOperation.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/requestcontext/ContextOperation.java
index bace618..26ac343 100644
--- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/requestcontext/ContextOperation.java
+++ b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/requestcontext/ContextOperation.java
@@ -17,5 +17,5 @@
 package ee.jakarta.tck.ws.rs.ee.rs.container.requestcontext;
 
 public enum ContextOperation {
-  ABORTWITH, GETACCEPTABLELANGUAGES, GETACCEPTABLELANGUAGESISREADONLY, GETACCEPTABLEMEDIATYPES, GETACCEPTABLEMEDIATYPESISREADONLY, GETCOOKIES, GETCOOKIESISREADONLY, GETDATE, GETENTITYSTREAM, GETHEADERS, GETHEADERSISMUTABLE, GETHEADERSTRING2, GETLANGUAGE, GETLENGTH, GETMEDIATYPE, GETMETHOD, GETPROPERTY, GETPROPERTYNAMES, GETPROPERTYNAMESISREADONLY, GETREQUEST, GETSECURITYCONTEXT, GETURIINFO, HASENTITY, REMOVEPROPERTY, SETENTITYSTREAM, SETMETHOD, SETPROPERTY, SETPROPERTYNULL, SETPROPERTYCONTEXT, SETREQUESTURI1, SETREQUESTURI2, SETSECURITYCONTEXT;
+  ABORTWITH, GETACCEPTABLELANGUAGES, GETACCEPTABLELANGUAGESISREADONLY, GETACCEPTABLEMEDIATYPES, GETACCEPTABLEMEDIATYPESISREADONLY, GETCOOKIES, GETCOOKIESISREADONLY, GETDATE, GETENTITYSTREAM, CONTAINSHEADERSTRING, GETHEADERS, GETHEADERSISMUTABLE, GETHEADERSTRING2, GETLANGUAGE, GETLENGTH, GETMEDIATYPE, GETMETHOD, GETPROPERTY, GETPROPERTYNAMES, GETPROPERTYNAMESISREADONLY, GETREQUEST, GETSECURITYCONTEXT, GETURIINFO, HASENTITY, REMOVEPROPERTY, SETENTITYSTREAM, SETMETHOD, SETPROPERTY, SETPROPERTYNULL, SETPROPERTYCONTEXT, SETREQUESTURI1, SETREQUESTURI2, SETSECURITYCONTEXT;
 }
diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/requestcontext/JAXRSClientIT.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/requestcontext/JAXRSClientIT.java
index dc3d48a..b41f8b9 100644
--- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/requestcontext/JAXRSClientIT.java
+++ b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/requestcontext/JAXRSClientIT.java
@@ -334,6 +334,34 @@
   }
 
   /*
+   * @testName: containsHeaderStringTest
+   * 
+   * @assertion_ids: JAXRS:JAVADOC:???
+   * 
+   * @test_Strategy: Check if the specified header contains a specified value.
+   * 
+   * Filter method called before a request has been dispatched to a resource.
+   * Throws IOException.
+   */
+  @Test
+  @Tag("servlet")
+  public void containsHeaderStringTest() throws Fault {    
+      setProperty(Property.REQUEST_HEADERS,
+              "Accept:text/*, text/html, text/html;level=1, */*");
+      setProperty(Property.REQUEST_HEADERS,
+              "Content-Type:application/xml;charset=utf8");
+      setProperty(Property.REQUEST_HEADERS,
+              "Header3:value1 ;; Value2 ;;value 3");
+      setProperty(Property.SEARCH_STRING, "Test1");
+      setProperty(Property.SEARCH_STRING, "Test2");
+      setProperty(Property.SEARCH_STRING, "Test3");
+      setProperty(Property.SEARCH_STRING, "Test4");
+      setProperty(Property.SEARCH_STRING, "Test5");
+
+      invokeRequestAndCheckResponse(ContextOperation.CONTAINSHEADERSTRING);
+  }
+
+  /*
    * @testName: getHeadersTest
    * 
    * @assertion_ids: JAXRS:JAVADOC:655; JAXRS:JAVADOC:677; JAXRS:JAVADOC:678;
diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/requestcontext/RequestFilter.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/requestcontext/RequestFilter.java
index c0cc756..a2aa30e 100644
--- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/requestcontext/RequestFilter.java
+++ b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/requestcontext/RequestFilter.java
@@ -140,16 +140,48 @@
     abortWithEntity(entity);
   }
 
+  public void containsHeaderString() {
+      StringBuffer sb = new StringBuffer();
+      sb.append("containsHeaderString= ");
+
+      try {
+          assertTrue(requestContext.containsHeaderString("accept", "text/html"::equals));
+          sb.append("Test1: accept contains text/html; ");
+        
+          //Verify Predicate and separator character usage
+          assertTrue(requestContext.containsHeaderString("Accept", ",", "Text/html;Level=1"::equalsIgnoreCase));
+          sb.append("Test2: accept contains text/html;level=1; ");
+          
+          //Verify incorrect separator character fails
+          assertTrue(!(requestContext.containsHeaderString("Accept", ";", "text/html;level=1"::equals))); 
+          sb.append("Test3: Incorrect separator character fails as expected; ");
+          
+          //Verify white space in value not trimmed and double character separator
+          assertTrue(!(requestContext.containsHeaderString("header3", ";;", "value3"::equals))); 
+          sb.append("Test4: White space not trimmed from value as expected; ");
+          
+          //Verify white space in front and back of value trimmed
+          assertTrue(requestContext.containsHeaderString("HEADER3", ";;", "value2"::equalsIgnoreCase));
+          sb.append("Test5: White space trimmed around value as expected; ");  
+      } catch (Throwable ex) {
+        sb.append("Unexpected exception thrown in containsHeaderString: "
+            + ex.getMessage());
+        ex.printStackTrace();
+      }
+      abortWithEntity(sb.toString());
+  }
+
   public void getHeaders() {
     MultivaluedMap<String, String> headers = requestContext.getHeaders();
     StringBuilder sb = new StringBuilder();
     for (Entry<String, List<String>> set : headers.entrySet()) {
-      String first = headers.getFirst(set.getKey());
+       String first = headers.getFirst(set.getKey());
       sb.append(set.getKey()).append(":").append(first).append(";");
     }
     abortWithEntity(sb.toString());
   }
 
+  
   public void getHeadersIsMutable() {
     String key = "KEY";
     MultivaluedMap<String, String> headers = requestContext.getHeaders();
diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/responsecontext/ContextOperation.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/responsecontext/ContextOperation.java
index 057e978..a1c2e8b 100644
--- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/responsecontext/ContextOperation.java
+++ b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/responsecontext/ContextOperation.java
@@ -17,7 +17,7 @@
 package ee.jakarta.tck.ws.rs.ee.rs.container.responsecontext;
 
 public enum ContextOperation {
-  GETALLOWEDMETHODS, GETCOOKIES, GETCOOKIESISREADONLY, GETDATE, GETENTITY, GETENTITYANNOTATIONS, GETENTITYANNOTATIONSONENTITY, GETENTITYCLASS, GETENTITYSTREAM, GETENTITYTAG, GETENTITYTYPE, GETHEADERS, GETHEADERSISMUTABLE, GETHEADERSTRINGOPERATION, GETHEADERSTRINGHEADER, GETLANGUAGE, GETLASTMODIFIED, GETLENGTH, GETLINK, GETLINKBUILDER, GETLINKS, GETLOCATION, GETMEDIATYPE, GETSTATUS, GETSTATUSINFO, GETSTRINGHEADERS, HASENTITY, HASLINK, SETENTITY, SETENTITYSTREAM, SETSTATUS, SETSTATUSINFO,
+  GETALLOWEDMETHODS, GETCOOKIES, GETCOOKIESISREADONLY, GETDATE, GETENTITY, GETENTITYANNOTATIONS, GETENTITYANNOTATIONSONENTITY, GETENTITYCLASS, GETENTITYSTREAM, GETENTITYTAG, GETENTITYTYPE, CONTAINSHEADERSTRING, GETHEADERS, GETHEADERSISMUTABLE, GETHEADERSTRINGOPERATION, GETHEADERSTRINGHEADER, GETLANGUAGE, GETLASTMODIFIED, GETLENGTH, GETLINK, GETLINKBUILDER, GETLINKS, GETLOCATION, GETMEDIATYPE, GETSTATUS, GETSTATUSINFO, GETSTRINGHEADERS, HASENTITY, HASLINK, SETENTITY, SETENTITYSTREAM, SETSTATUS, SETSTATUSINFO,
 
   // just helping methods, pass
   SETSTRINGBEANRUNTIME, SETORIGINALRUNTIME
diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/responsecontext/JAXRSClientIT.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/responsecontext/JAXRSClientIT.java
index c40db3f..504b360 100644
--- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/responsecontext/JAXRSClientIT.java
+++ b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/responsecontext/JAXRSClientIT.java
@@ -456,6 +456,25 @@
    * Throws IOException.
    */
   @Test
+  public void containsHeaderStringTest() throws Fault {
+    String header = "Test";
+    for (int i = 1; i != 6; i++)
+      setProperty(Property.UNORDERED_SEARCH_STRING, header + i);
+    setProperty(Property.CONTENT, header);
+    invokeRequestAndCheckResponse(ContextOperation.CONTAINSHEADERSTRING);
+  }
+
+  /*
+   * @testName: getHeadersTest
+   * 
+   * @assertion_ids: JAXRS:JAVADOC:688; JAXRS:JAVADOC:707; JAXRS:JAVADOC:708;
+   * 
+   * @test_Strategy: Get the mutable response headers multivalued map.
+   *
+   * Filter method called after a response has been provided for a request.
+   * Throws IOException.
+   */
+  @Test
   public void getHeadersTest() throws Fault {
     String header = "header";
     for (int i = 0; i != 5; i++)
diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/responsecontext/Resource.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/responsecontext/Resource.java
index dc0cef1..da7cfb6 100644
--- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/responsecontext/Resource.java
+++ b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/responsecontext/Resource.java
@@ -180,6 +180,17 @@
   }
 
   @POST
+  @Path("containsheaderstring")
+  public Response containsHeaderString(String header) {
+    ResponseBuilder builder = createResponseWithHeader();
+    builder = builder.header("Accept", "text/html, text/html;level=1, */*");
+    builder = builder.header("Content-Type", "application/xml;charset=utf8");
+    builder = builder.header("Header3", "value1 ;; Value2 ;;value 3");
+    Response response = builder.build();
+    return response;   
+  }
+
+  @POST
   @Path("getheaders")
   public Response getHeaders(String header) {
     ResponseBuilder builder = createResponseWithHeader();
diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/responsecontext/ResponseFilter.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/responsecontext/ResponseFilter.java
index 7c7c3c9..82cd7a6 100644
--- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/responsecontext/ResponseFilter.java
+++ b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/ee/rs/container/responsecontext/ResponseFilter.java
@@ -152,10 +152,41 @@
     setEntity(name);
   }
 
+  public void containsHeaderString() {
+      StringBuffer sb = new StringBuffer();
+      sb.append("containsHeaderString= ");
+
+      try {
+          assertTrue(requestContext.containsHeaderString("accept", "text/html"::equals));
+          sb.append("Test1: accept contains text/html; ");
+        
+          //Verify Predicate and separator character usage
+          assertTrue(requestContext.containsHeaderString("Accept", ",", "Text/html;Level=1"::equalsIgnoreCase));
+          sb.append("Test2: accept contains text/html;level=1; ");
+          
+          //Verify incorrect separator character fails
+          assertTrue(!(requestContext.containsHeaderString("Accept", ";", "text/html;level=1"::equals))); 
+          sb.append("Test3: Incorrect separator character fails as expected; ");
+          
+          //Verify white space in value not trimmed and double character separator
+          assertTrue(!(requestContext.containsHeaderString("header3", ";;", "value3"::equals))); 
+          sb.append("Test4: White space not trimmed from value as expected; ");
+          
+          //Verify white space in front and back of value trimmed
+          assertTrue(requestContext.containsHeaderString("HEADER3", ";;", "value2"::equalsIgnoreCase));
+          sb.append("Test5: White space trimmed around value as expected; ");  
+      } catch (Throwable ex) {
+        sb.append("Unexpected exception thrown in containsHeaderString: "
+            + ex.getMessage());
+        ex.printStackTrace();
+      }
+      setEntity(sb.toString());
+    }
+  
   public void getHeaders() {
-    MultivaluedMap<String, Object> headers = responseContext.getHeaders();
-    setEntity(collectionToString(headers.keySet()));
-  }
+      MultivaluedMap<String, Object> headers = responseContext.getHeaders();
+      setEntity(collectionToString(headers.keySet()));
+    }
 
   public void getHeadersIsMutable() {
     MultivaluedMap<String, Object> headers = responseContext.getHeaders();