summaryrefslogtreecommitdiffstats
path: root/content/test/plugin/plugin_request_read_test.cc
diff options
context:
space:
mode:
Diffstat (limited to 'content/test/plugin/plugin_request_read_test.cc')
-rw-r--r--content/test/plugin/plugin_request_read_test.cc111
1 files changed, 111 insertions, 0 deletions
diff --git a/content/test/plugin/plugin_request_read_test.cc b/content/test/plugin/plugin_request_read_test.cc
new file mode 100644
index 0000000..dfdcd52
--- /dev/null
+++ b/content/test/plugin/plugin_request_read_test.cc
@@ -0,0 +1,111 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/test/plugin/plugin_request_read_test.h"
+
+#include "base/basictypes.h"
+
+namespace NPAPIClient {
+
+PluginRequestReadTest::PluginRequestReadTest(NPP id,
+ NPNetscapeFuncs* host_functions)
+ : PluginTest(id, host_functions),
+ tests_started_(false),
+ read_requested_(false) {
+}
+
+PluginRequestReadTest::~PluginRequestReadTest() {
+}
+
+NPError PluginRequestReadTest::New(uint16 mode, int16 argc, const char* argn[],
+ const char* argv[], NPSavedData* saved) {
+ url_to_request_ = GetArgValue("url_to_request", argc, argn, argv);
+ return PluginTest::New(mode, argc, argn, argv, saved);
+}
+
+NPError PluginRequestReadTest::SetWindow(NPWindow* window) {
+ if (!tests_started_) {
+ tests_started_ = true;
+ NPError result = HostFunctions()->geturl(id(),
+ url_to_request_.c_str(),
+ NULL);
+ if (result != NPERR_NO_ERROR)
+ SetError("Failed request anURL.");
+ }
+ return PluginTest::SetWindow(window);
+}
+
+NPError PluginRequestReadTest::NewStream(NPMIMEType type, NPStream* stream,
+ NPBool seekable, uint16* stream_type) {
+ *stream_type = NP_SEEK;
+ if (!read_requested_) {
+ requested_ranges_.resize(1);
+ requested_ranges_[0].offset = 4;
+ requested_ranges_[0].length = 6;
+ requested_ranges_[0].next = NULL;
+ NPError result = HostFunctions()->requestread(stream,
+ &requested_ranges_[0]);
+ if (result != NPERR_NO_ERROR)
+ SetError("Failed request read from stream.");
+ read_requested_ = true;
+ }
+ return PluginTest::NewStream(type, stream, seekable, stream_type);
+}
+
+NPError PluginRequestReadTest::DestroyStream(NPStream *stream, NPError reason) {
+ if (!requested_ranges_.empty())
+ SetError("Some requested ranges are not received!");
+ SignalTestCompleted();
+ return PluginTest::DestroyStream(stream, reason);
+}
+
+int32 PluginRequestReadTest::WriteReady(NPStream* stream) {
+ int32 result = 0;
+ for (size_t i = 0; i < requested_ranges_.size(); ++i)
+ result += requested_ranges_[i].length;
+ return result;
+}
+
+int32 PluginRequestReadTest::Write(NPStream* stream, int32 offset, int32 len,
+ void* buffer) {
+ std::vector<NPByteRange>::iterator it;
+ // Remove received range (or sub-range) from requested_ranges_, and
+ // verify that we have received proper data.
+
+ for (it = requested_ranges_.begin(); it != requested_ranges_.end(); ++it) {
+ if (it->offset == offset)
+ break;
+ }
+ if (it == requested_ranges_.end()) {
+ // It is Ok for browser to write some data from start of the stream before
+ // we've issued any read requests.
+ return len;
+ }
+ // Shrink range to mark area we have just received.
+ it->offset += len;
+ if (static_cast<int32>(it->length) < len)
+ it->length = 0;
+ else
+ it->length -= len;
+ if (it->length == 0)
+ requested_ranges_.erase(it);
+
+ // Verify that data, which we got, is right.
+ const char* data = static_cast<const char*>(buffer);
+ for (int32 i = 0; i < len; ++i) {
+ int cur_offset = offset + i;
+ char expected = '0' + cur_offset;
+ if (data[i] != expected) {
+ SetError("Content mismatch between data and source!");
+ break;
+ }
+ }
+ if (requested_ranges_.empty())
+ SignalTestCompleted();
+
+ return len;
+}
+
+} // namespace NPAPIClient
+