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