1*6777b538SAndroid Build Coastguard Worker // Copyright 2011 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #include "net/base/test_data_stream.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include <algorithm>
8*6777b538SAndroid Build Coastguard Worker #include <cstring>
9*6777b538SAndroid Build Coastguard Worker
10*6777b538SAndroid Build Coastguard Worker namespace net {
11*6777b538SAndroid Build Coastguard Worker
TestDataStream()12*6777b538SAndroid Build Coastguard Worker TestDataStream::TestDataStream() {
13*6777b538SAndroid Build Coastguard Worker Reset();
14*6777b538SAndroid Build Coastguard Worker }
15*6777b538SAndroid Build Coastguard Worker
16*6777b538SAndroid Build Coastguard Worker // Fill |buffer| with |length| bytes of data from the stream.
GetBytes(char * buffer,int length)17*6777b538SAndroid Build Coastguard Worker void TestDataStream::GetBytes(char* buffer, int length) {
18*6777b538SAndroid Build Coastguard Worker while (length) {
19*6777b538SAndroid Build Coastguard Worker AdvanceIndex();
20*6777b538SAndroid Build Coastguard Worker int bytes_to_copy = std::min(length, bytes_remaining_);
21*6777b538SAndroid Build Coastguard Worker memcpy(buffer, buffer_ptr_, bytes_to_copy);
22*6777b538SAndroid Build Coastguard Worker buffer += bytes_to_copy;
23*6777b538SAndroid Build Coastguard Worker Consume(bytes_to_copy);
24*6777b538SAndroid Build Coastguard Worker length -= bytes_to_copy;
25*6777b538SAndroid Build Coastguard Worker }
26*6777b538SAndroid Build Coastguard Worker }
27*6777b538SAndroid Build Coastguard Worker
VerifyBytes(const char * buffer,int length)28*6777b538SAndroid Build Coastguard Worker bool TestDataStream::VerifyBytes(const char *buffer, int length) {
29*6777b538SAndroid Build Coastguard Worker while (length) {
30*6777b538SAndroid Build Coastguard Worker AdvanceIndex();
31*6777b538SAndroid Build Coastguard Worker int bytes_to_compare = std::min(length, bytes_remaining_);
32*6777b538SAndroid Build Coastguard Worker if (memcmp(buffer, buffer_ptr_, bytes_to_compare))
33*6777b538SAndroid Build Coastguard Worker return false;
34*6777b538SAndroid Build Coastguard Worker Consume(bytes_to_compare);
35*6777b538SAndroid Build Coastguard Worker length -= bytes_to_compare;
36*6777b538SAndroid Build Coastguard Worker buffer += bytes_to_compare;
37*6777b538SAndroid Build Coastguard Worker }
38*6777b538SAndroid Build Coastguard Worker return true;
39*6777b538SAndroid Build Coastguard Worker }
40*6777b538SAndroid Build Coastguard Worker
Reset()41*6777b538SAndroid Build Coastguard Worker void TestDataStream::Reset() {
42*6777b538SAndroid Build Coastguard Worker index_ = 0;
43*6777b538SAndroid Build Coastguard Worker bytes_remaining_ = 0;
44*6777b538SAndroid Build Coastguard Worker buffer_ptr_ = buffer_;
45*6777b538SAndroid Build Coastguard Worker }
46*6777b538SAndroid Build Coastguard Worker
47*6777b538SAndroid Build Coastguard Worker // If there is no data spilled over from the previous index, advance the
48*6777b538SAndroid Build Coastguard Worker // index and fill the buffer.
AdvanceIndex()49*6777b538SAndroid Build Coastguard Worker void TestDataStream::AdvanceIndex() {
50*6777b538SAndroid Build Coastguard Worker if (bytes_remaining_ == 0) {
51*6777b538SAndroid Build Coastguard Worker // Convert it to ascii, but don't bother to reverse it.
52*6777b538SAndroid Build Coastguard Worker // (e.g. 12345 becomes "54321")
53*6777b538SAndroid Build Coastguard Worker int val = index_++;
54*6777b538SAndroid Build Coastguard Worker do {
55*6777b538SAndroid Build Coastguard Worker buffer_[bytes_remaining_++] = (val % 10) + '0';
56*6777b538SAndroid Build Coastguard Worker } while ((val /= 10) > 0);
57*6777b538SAndroid Build Coastguard Worker buffer_[bytes_remaining_++] = '.';
58*6777b538SAndroid Build Coastguard Worker }
59*6777b538SAndroid Build Coastguard Worker }
60*6777b538SAndroid Build Coastguard Worker
61*6777b538SAndroid Build Coastguard Worker // Consume data from the spill buffer.
Consume(int bytes)62*6777b538SAndroid Build Coastguard Worker void TestDataStream::Consume(int bytes) {
63*6777b538SAndroid Build Coastguard Worker bytes_remaining_ -= bytes;
64*6777b538SAndroid Build Coastguard Worker if (bytes_remaining_)
65*6777b538SAndroid Build Coastguard Worker buffer_ptr_ += bytes;
66*6777b538SAndroid Build Coastguard Worker else
67*6777b538SAndroid Build Coastguard Worker buffer_ptr_ = buffer_;
68*6777b538SAndroid Build Coastguard Worker }
69*6777b538SAndroid Build Coastguard Worker
70*6777b538SAndroid Build Coastguard Worker } // namespace net
71