15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (c) 2011 The Chromium Authors. All rights reserved.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Use of this source code is governed by a BSD-style license that can be
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * found in the LICENSE file.
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test for resource open before PPAPI initialization.
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdio.h>
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h>
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sstream>
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "native_client/src/untrusted/irt/irt.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "native_client/src/untrusted/nacl/nacl_irt.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/instance.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/module.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/var.h"
239ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "ppapi/native_client/src/shared/ppapi_proxy/ppruntime.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string str;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void load_manifest(TYPE_nacl_irt_query *query_func) {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct nacl_irt_resource_open nacl_irt_resource_open;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (sizeof(nacl_irt_resource_open) !=
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (*query_func)(
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          NACL_IRT_RESOURCE_OPEN_v0_1,
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          &nacl_irt_resource_open,
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          sizeof(nacl_irt_resource_open))) {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    str = "irt manifest api not found";
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int desc;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int error;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error = nacl_irt_resource_open.open_resource("test_file", &desc);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (0 != error) {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    str = "Can't open file";
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("Can't open file, error=%d", error);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  str = "File Contents:\n";
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FILE *iob = fdopen(desc, "r");
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char buffer[4096];
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (fgets(buffer, sizeof buffer, iob) != NULL) {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // NB: fgets does not discard the newline nor any carriage return
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // character before that.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Note that CR LF is the default end-of-line style for Windows.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Furthermore, when the test_file (input data, which happens to
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // be the nmf file) is initially created in a change list, the
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // patch is sent to our try bots as text.  This means that when
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the file arrives, it has CR LF endings instead of the original
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // LF line endings.  Since the expected or golden data is
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // (manually) encoded in the HTML file's JavaScript, there will be
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // a mismatch.  After submission, the svn property svn:eol-style
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // will be set to LF, so a clean check out should have LF and not
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // CR LF endings, and the tests will pass without CR removal.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // However -- and there's always a however in long discourses --
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // if the nmf file is edited, say, because the test is being
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // modified, and the modification is being done on a Windows
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // machine, then it is likely that the editor used by the
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // programmer will convert the file to CR LF endings.  Which,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // unfortunatly, implies that the test will mysteriously fail
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // again.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // To defend against such nonsense, we weaken the test slighty,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // and just strip the CR if it is present.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int len = strlen(buffer);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (len >= 2 && buffer[len-1] == '\n' && buffer[len-2] == '\r') {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      buffer[len-2] = '\n';
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      buffer[len-1] = '\0';
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    str += buffer;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printf("file loaded: %s\n", str.c_str());
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fclose(iob);  // closed desc
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestInstance : public pp::Instance {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit TestInstance(PP_Instance instance) : pp::Instance(instance) {}
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestInstance() {}
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void HandleMessage(const pp::Var& var_message) {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!var_message.is_string()) {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (var_message.AsString() != "hello") {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pp::Var reply = pp::Var(str);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PostMessage(reply);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestModule : public pp::Module {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestModule() : pp::Module() {}
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestModule() {}
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual pp::Instance* CreateInstance(PP_Instance instance) {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return new TestInstance(instance);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace pp {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Module* CreateModule() {
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new TestModule();
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int main() {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_manifest(&__nacl_irt_query);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return PpapiPluginMain();
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
123