Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <algorithm> | 5 #include <algorithm> |
| 6 #include <string> | 6 #include <string> |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
| 10 #include "base/file_path.h" | |
| 11 #include "base/file_util.h" | |
| 10 #include "base/time.h" | 12 #include "base/time.h" |
| 13 #include "base/values.h" | |
| 14 #include "base/json/json_reader.h" | |
| 11 #include "base/memory/scoped_ptr.h" | 15 #include "base/memory/scoped_ptr.h" |
|
szym
2012/06/04 20:26:24
fix ordering
Deprecated (see juliatuttle)
2012/06/05 20:18:10
Done.
| |
| 12 #include "net/base/address_list.h" | 16 #include "net/base/address_list.h" |
| 13 #include "net/base/dns_util.h" | 17 #include "net/base/dns_util.h" |
| 14 #include "net/base/io_buffer.h" | 18 #include "net/base/io_buffer.h" |
| 15 #include "net/base/ip_endpoint.h" | 19 #include "net/base/ip_endpoint.h" |
| 16 #include "net/dns/dns_protocol.h" | 20 #include "net/dns/dns_protocol.h" |
| 17 #include "net/dns/dns_query.h" | 21 #include "net/dns/dns_query.h" |
| 18 #include "net/dns/dns_response.h" | 22 #include "net/dns/dns_response.h" |
| 19 | 23 |
| 20 namespace { | 24 namespace { |
| 21 | 25 |
| 22 // TODO(ttuttle): This should read from the file, probably in JSON. | 26 bool FitsUint8(int num) { |
| 27 return (num >= 0) && (num <= kuint8max); | |
| 28 } | |
| 29 | |
| 30 bool FitsUint16(int num) { | |
| 31 return (num >= 0) && (num <= kuint16max); | |
| 32 } | |
| 33 | |
| 23 bool ReadTestCase(const char* filename, | 34 bool ReadTestCase(const char* filename, |
| 24 uint16* id, std::string* qname, uint16* qtype, | 35 uint16* id, std::string* qname, uint16* qtype, |
| 25 std::vector<char>* resp_buf) { | 36 std::vector<char>* resp_buf) { |
| 26 static const unsigned char resp_bytes[] = { | 37 FilePath filepath = FilePath::FromUTF8Unsafe(filename); |
| 27 0x00, 0x00, 0x81, 0x80, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, | |
| 28 0x01, 0x61, 0x00, 0x00, 0x01, 0x00, 0x01, | |
| 29 0x01, 0x61, 0x00, 0x00, 0x01, 0x00, 0x01, | |
| 30 0x00, 0x00, 0x00, 0xff, 0x00, 0x04, 0x0a, 0x0a, 0x0a, 0x0a }; | |
| 31 | 38 |
| 32 *id = 0x0000; | 39 std::string json; |
| 33 *qname = "a"; | 40 if (!file_util::ReadFileToString(filepath, &json)) { |
| 34 *qtype = 0x0001; | 41 LOG(ERROR) << "Couldn't read file " << filename << "."; |
| 35 resp_buf->assign(resp_bytes, resp_bytes + arraysize(resp_bytes)); | 42 return false; |
| 43 } | |
| 44 | |
| 45 Value* value = base::JSONReader::Read(json); | |
|
cbentzel
2012/06/04 23:49:23
Use a scoped_ptr here for the returned value.
Opt
Deprecated (see juliatuttle)
2012/06/05 20:18:10
Done.
| |
| 46 if (!value) { | |
| 47 LOG(ERROR) << "Couldn't parse JSON in " << filename << "."; | |
| 48 return false; | |
| 49 } | |
| 50 | |
| 51 // root of JSON should always be a dictionary | |
| 52 DictionaryValue* dict; | |
| 53 CHECK(value->GetAsDictionary(&dict)); | |
|
cbentzel
2012/06/04 23:49:23
Is this true? What if the file just consisted of a
Deprecated (see juliatuttle)
2012/06/05 20:18:10
It's actually not; the spec requires that it be a
| |
| 54 | |
| 55 int id_int; | |
| 56 if (!dict->GetInteger("id", &id_int) || !FitsUint16(id_int)) { | |
|
cbentzel
2012/06/04 23:49:23
Although boolean short-circuiting should make this
Deprecated (see juliatuttle)
2012/06/05 20:18:10
Done.
| |
| 57 LOG(ERROR) << "No id, not an integer, or not in range."; | |
| 58 return false; | |
| 59 } | |
| 60 *id = static_cast<uint16>(id_int); | |
| 61 | |
| 62 if (!dict->GetStringASCII("qname", qname)) { | |
| 63 LOG(ERROR) << "No qname or not a string."; | |
| 64 return false; | |
| 65 } | |
| 66 | |
| 67 int qtype_int; | |
| 68 if (!dict->GetInteger("qtype", &qtype_int) || !FitsUint16(qtype_int)) { | |
| 69 LOG(ERROR) << "No qtype, not an integer, or not in range."; | |
| 70 return false; | |
| 71 } | |
| 72 *qtype = static_cast<uint16>(qtype_int); | |
| 73 | |
| 74 ListValue* resp_list; | |
| 75 if (!dict->GetList("response", &resp_list)) { | |
| 76 LOG(ERROR) << "No response, or not a list."; | |
| 77 return false; | |
| 78 } | |
| 79 | |
| 80 size_t resp_size = resp_list->GetSize(); | |
| 81 resp_buf->clear(); | |
| 82 resp_buf->reserve(resp_size); | |
| 83 for (size_t i = 0; i < resp_size; i++) { | |
| 84 int byte_int; | |
| 85 if ((!resp_list->GetInteger(i, &byte_int)) || !FitsUint8(byte_int)) { | |
| 86 LOG(ERROR) << "response[" << i << "] not an integer or not in range."; | |
| 87 return false; | |
| 88 } | |
| 89 resp_buf->push_back(static_cast<char>(byte_int)); | |
|
szym
2012/06/04 20:26:24
The behavior of this cast is not defined by the st
szym
2012/06/04 20:32:17
Sorry, that won't work directly, but you get my po
Deprecated (see juliatuttle)
2012/06/05 20:18:10
We decided to stick with this, since it works and
| |
| 90 } | |
| 91 DCHECK(resp_buf->size() == resp_size); | |
| 36 | 92 |
| 37 return true; | 93 return true; |
| 38 } | 94 } |
| 39 | 95 |
| 40 } | 96 } |
| 41 | 97 |
| 42 int main(int argc, char** argv) { | 98 int main(int argc, char** argv) { |
| 43 if (argc != 2) { | 99 if (argc != 2) { |
| 44 LOG(ERROR) << "Usage: " << argv[0] << " test_case_filename"; | 100 LOG(ERROR) << "Usage: " << argv[0] << " test_case_filename"; |
| 45 return 1; | 101 return 1; |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 90 | 146 |
| 91 LOG(INFO) << "Address List:"; | 147 LOG(INFO) << "Address List:"; |
| 92 for (unsigned int i = 0; i < address_list.size(); i++) { | 148 for (unsigned int i = 0; i < address_list.size(); i++) { |
| 93 LOG(INFO) << "\t" << address_list[i].ToString(); | 149 LOG(INFO) << "\t" << address_list[i].ToString(); |
| 94 } | 150 } |
| 95 LOG(INFO) << "TTL: " << ttl.InSeconds() << " seconds"; | 151 LOG(INFO) << "TTL: " << ttl.InSeconds() << " seconds"; |
| 96 | 152 |
| 97 return 0; | 153 return 0; |
| 98 } | 154 } |
| 99 | 155 |
| OLD | NEW |