17d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
27d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
37d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// found in the LICENSE file.
47d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "ppapi/native_client/src/trusted/plugin/nacl_http_response_headers.h"
67d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
77d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <string>
87d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Test that we are able to discover the cache validator headers.
127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST(NaClHttpResponseHeadersTest, TestGetValidators) {
137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Test a single (weak) ETag.
147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string one_val_headers("Date: Wed, 15 Nov 1995 06:25:24 GMT\n"
157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                              "Server: Apache/2.0.52 (CentOS)\n"
167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                              "Content-Type: text/plain; charset=UTF-8\n"
177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                              "Connection: close\n"
187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                              "Accept-Ranges: bytes\n"
197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                              "ETag: w\"abcdefg\"\n"
207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                              "Content-Length: 2912652\n");
217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  std::string one_val_expected("etag:w\"abcdefg\"");
227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  plugin::NaClHttpResponseHeaders parser_1;
237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  parser_1.Parse(one_val_headers);
247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(one_val_expected, parser_1.GetCacheValidators());
257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(std::string("w\"abcdefg\""), parser_1.GetHeader("etag"));
267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(std::string(), parser_1.GetHeader("last-modified"));
277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Test a Last-Modified Header.
297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string mod_val_headers("Date: Wed, 15 Nov 1995 06:25:24 GMT\n"
307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                              "Server: Apache/2.0.52 (CentOS)\n"
317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                              "Content-Type: text/plain; charset=UTF-8\n"
327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                              "Connection: close\n"
337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                              "Accept-Ranges: bytes\n"
347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                              "Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT\n"
357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                              "Content-Length: 2912652\n");
367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  std::string mod_val_expected("last-modified:Wed, 15 Nov 1995 04:58:08 GMT");
377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  plugin::NaClHttpResponseHeaders parser_1b;
387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  parser_1b.Parse(mod_val_headers);
397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(mod_val_expected, parser_1b.GetCacheValidators());
407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(std::string("Wed, 15 Nov 1995 04:58:08 GMT"),
417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            parser_1b.GetHeader("last-modified"));
427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Test both (strong) ETag and Last-Modified, with some whitespace.
447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string two_val_headers("Date: Wed, 15 Nov 1995 06:25:24 GMT\n"
457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                              "Last-modified: Wed, 15 Nov 1995 04:58:08 GMT\n"
467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                              "Server: Apache/2.0.52 (CentOS)\n"
477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                              "etag  \t :\t   \"/abcdefg:A-Z0-9+/==\"\n"
487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                              "Content-Type: text/plain; charset=UTF-8\n"
497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                              "cache-control: no-cache\n"
507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                              "Connection: close\n"
517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                              "Accept-Ranges: bytes\n"
527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                              "Content-Length: 2912652\n");
537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Note that the value can still have white-space.
547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  std::string two_val_expected("etag:\"/abcdefg:A-Z0-9+/==\"&"
557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                               "last-modified:Wed, 15 Nov 1995 04:58:08 GMT");
567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  plugin::NaClHttpResponseHeaders parser_2;
577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  parser_2.Parse(two_val_headers);
587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(two_val_expected, parser_2.GetCacheValidators());
597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(std::string("\"/abcdefg:A-Z0-9+/==\""),
607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            parser_2.GetHeader("etag"));
617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Some etag generators like python HTTP server use ' instead of "
637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string single_q_headers("Date: Wed, 15 Nov 1995 06:25:24 GMT\n"
647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                               "Server: BaseHTTP/0.3 Python/2.7.3\n"
657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                               "ETag: '/usr/local/some_file.nmf'\n");
667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  std::string single_q_expected("etag:'/usr/local/some_file.nmf'");
677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  plugin::NaClHttpResponseHeaders parser_3;
687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  parser_3.Parse(single_q_headers);
697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(single_q_expected, parser_3.GetCacheValidators());
707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(std::string("'/usr/local/some_file.nmf'"),
717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            parser_3.GetHeader("etag"));
727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Keys w/ leading whitespace are invalid.
747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // See: HttpResponseHeadersTest.NormalizeHeadersLeadingWhitespace.
757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string bad_headers("Date: Wed, 15 Nov 1995 06:25:24 GMT\n"
767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                          "Server: BaseHTTP/0.3 Python/2.7.3\n"
777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                          "   ETag: '/usr/local/some_file.nmf'\n");
787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string bad_expected("");
797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  plugin::NaClHttpResponseHeaders parser_4;
807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  parser_4.Parse(bad_headers);
817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(bad_expected, parser_4.GetCacheValidators());
827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(bad_expected, parser_4.GetHeader("etag"));
837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Test that we are able to determine when there is a no-store
867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Cache-Control header, among all the Cache-Control headers.
877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST(NaClHttpResponseHeadersTest, TestFindNoStore) {
887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Say that there isn't one, when there isn't one.
897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string headers_0("Date: Wed, 15 Nov 1995 06:25:24 GMT\n"
907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                        "Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT\n"
917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                        "ETag: '/tmp/blah.nmf'\n"
927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                        "Cache-Control: max-age=3600\n");
937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  plugin::NaClHttpResponseHeaders parser_0;
947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  parser_0.Parse(headers_0);
957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(parser_0.CacheControlNoStore());
967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Say that there is one, when there is one.
987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string headers_1("Date: Wed, 15 Nov 1995 06:25:24 GMT\n"
997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                        "Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT\n"
1007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                        "ETag: \"/abcdefgA-Z0-9+/\"\n"
1017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                        "Cache-Control: no-store\n");
1027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  plugin::NaClHttpResponseHeaders parser_1;
1037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  parser_1.Parse(headers_1);
1047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(parser_1.CacheControlNoStore());
1057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Say that there is one, when comma separated.
1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string headers_2("Date: Wed, 15 Nov 1995 06:25:24 GMT\n"
1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                        "Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT\n"
1097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                        "ETag: \"/abcdefgA-Z0-9+/\"\n"
1107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                        "Cache-Control: no-store, no-cache\n");
1117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  plugin::NaClHttpResponseHeaders parser_2;
1127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  parser_2.Parse(headers_2);
1137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(parser_2.CacheControlNoStore());
1147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Comma separated, in a different position.
1167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string headers_3("Date: Wed, 15 Nov 1995 06:25:24 GMT\n"
1177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                        "Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT\n"
1187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                        "ETag: \"/abcdefgA-Z0-9+/\"\n"
1197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                        "Cache-control: no-cache, max-age=60, no-store\n");
1207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  plugin::NaClHttpResponseHeaders parser_3;
1217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  parser_3.Parse(headers_3);
1227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(parser_3.CacheControlNoStore());
1237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Test multiple cache-control lines, plus extra space before colon.
1257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string headers_4("Date: Wed, 15 Nov 1995 06:25:24 GMT\n"
1267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                        "Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT\n"
1277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                        "ETag: \"/abcdefgA-Z0-9+/\"\n"
1287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                        "cache-control: no-cache\n"
1297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                        "cache-control \t : max-age=60, no-store, max-stale\n");
1307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  plugin::NaClHttpResponseHeaders parser_4;
1317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  parser_4.Parse(headers_4);
1327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(parser_4.CacheControlNoStore());
1337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Test with extra whitespace, in the values.
1357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string headers_5("Date:   Wed, 15 Nov 1995 06:25:24 GMT  \n"
1367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                        "Last-Modified:   Wed, 15 Nov 1995 04:58:08 GMT  \n"
1377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                        "ETag:   \"/abcdefgA-Z0-9+/\"  \n"
1387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                        ": empty  key \n"
1397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                        ": empty  key2 \n"
1407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                        "Blank-Header :   \n"
1417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                        "Connection: close\n"
1427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                        "cache-control:max-age=60,  no-store  \n"
1437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                        "cache-control: no-cache\n");
1447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  plugin::NaClHttpResponseHeaders parser_5;
1457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  parser_5.Parse(headers_5);
1467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(parser_5.CacheControlNoStore());
1477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
148