15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/test_data_stream.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestDataStream::TestDataStream() {
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Reset();
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fill |buffer| with |length| bytes of data from the stream.
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestDataStream::GetBytes(char* buffer, int length) {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (length) {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AdvanceIndex();
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int bytes_to_copy = std::min(length, bytes_remaining_);
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memcpy(buffer, buffer_ptr_, bytes_to_copy);
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buffer += bytes_to_copy;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Consume(bytes_to_copy);
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    length -= bytes_to_copy;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestDataStream::VerifyBytes(const char *buffer, int length) {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (length) {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AdvanceIndex();
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int bytes_to_compare = std::min(length, bytes_remaining_);
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (memcmp(buffer, buffer_ptr_, bytes_to_compare))
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Consume(bytes_to_compare);
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    length -= bytes_to_compare;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buffer += bytes_to_compare;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestDataStream::Reset() {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  index_ = 0;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bytes_remaining_ = 0;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  buffer_ptr_ = buffer_;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If there is no data spilled over from the previous index, advance the
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// index and fill the buffer.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestDataStream::AdvanceIndex() {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (bytes_remaining_ == 0) {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Convert it to ascii, but don't bother to reverse it.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // (e.g. 12345 becomes "54321")
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int val = index_++;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    do {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      buffer_[bytes_remaining_++] = (val % 10) + '0';
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } while ((val /= 10) > 0);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buffer_[bytes_remaining_++] = '.';
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Consume data from the spill buffer.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestDataStream::Consume(int bytes) {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bytes_remaining_ -= bytes;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (bytes_remaining_)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buffer_ptr_ += bytes;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    buffer_ptr_ = buffer_;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
69