diff options
author | Jiri Vanek <[email protected]> | 2013-03-28 15:51:38 +0100 |
---|---|---|
committer | Jiri Vanek <[email protected]> | 2013-03-28 15:51:38 +0100 |
commit | 8d2d31514295a2d0eff5971887246f6d4211fc6d (patch) | |
tree | d66ce4fb57c823a2aa8894bb6894b33bdbe162f6 | |
parent | 58b4d6e3dc3a95cfbc6f369287aca04763522e48 (diff) |
Added code to parse properties and to find correct configuration files from c++ part of plugin.
-rw-r--r-- | ChangeLog | 15 | ||||
-rw-r--r-- | Makefile.am | 4 | ||||
-rw-r--r-- | plugin/icedteanp/IcedTeaParseProperties.cc | 244 | ||||
-rw-r--r-- | plugin/icedteanp/IcedTeaParseProperties.h | 53 | ||||
-rw-r--r-- | plugin/icedteanp/IcedTeaPluginUtils.cc | 17 | ||||
-rw-r--r-- | plugin/icedteanp/IcedTeaPluginUtils.h | 7 | ||||
-rw-r--r-- | tests/cpp-unit-tests/IcedTeaParsePropertiesTest.cc | 525 | ||||
-rw-r--r-- | tests/cpp-unit-tests/IcedTeaPluginUtilsTest.cc | 40 |
8 files changed, 903 insertions, 2 deletions
@@ -1,3 +1,18 @@ +2013-03-22 Jiri Vanek <[email protected]> + + Added code to parse properties and to find correct configuration files + from c++ part of plugin + * Makefile.am: IcedTeaParseProperties.cc added to be compiled with rest + of plugin + * plugin/icedteanp/IcedTeaParseProperties.cc: new file, contains implementation + for searching for config files and to read value from them + * plugin/icedteanp/IcedTeaParseProperties.h: public api for "library" + * plugin/icedteanp/IcedTeaPluginUtils.cc: + * plugin/icedteanp/IcedTeaPluginUtils.h: added new methods (trim) and + (file_exists) + * tests/cpp-unit-tests/IcedTeaParsePropertiesTest.cc: tests for library methods + * tests/cpp-unit-tests/IcedTeaPluginUtilsTest.cc: added tests for new methods + 2013-03-26 Adam Domurad <[email protected]> Integration of unsigned applet confirmation dialogue. diff --git a/Makefile.am b/Makefile.am index aa93793..791e3a6 100644 --- a/Makefile.am +++ b/Makefile.am @@ -284,11 +284,11 @@ if ENABLE_PLUGIN PLUGIN_SRC=IcedTeaNPPlugin.cc IcedTeaScriptablePluginObject.cc \ IcedTeaJavaRequestProcessor.cc IcedTeaPluginRequestProcessor.cc \ - IcedTeaPluginUtils.cc + IcedTeaPluginUtils.cc IcedTeaParseProperties.cc PLUGIN_OBJECTS=IcedTeaNPPlugin.o IcedTeaScriptablePluginObject.o \ IcedTeaJavaRequestProcessor.o IcedTeaPluginRequestProcessor.o \ - IcedTeaPluginUtils.o + IcedTeaPluginUtils.o IcedTeaParseProperties.o $(PLUGIN_DIR)/%.o: $(PLUGIN_SRCDIR)/%.cc mkdir -p $(PLUGIN_DIR) && \ diff --git a/plugin/icedteanp/IcedTeaParseProperties.cc b/plugin/icedteanp/IcedTeaParseProperties.cc new file mode 100644 index 0000000..7203d79 --- /dev/null +++ b/plugin/icedteanp/IcedTeaParseProperties.cc @@ -0,0 +1,244 @@ +/* IcedTeaRunnable.cc + + Copyright (C) 2013 Red Hat + +This file is part of IcedTea. + +IcedTea is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +IcedTea is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + +You should have received a copy of the GNU General Public License +along with IcedTea; see the file COPYING. If not, write to the +Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301 USA. + +Linking this library statically or dynamically with other modules is +making a combined work based on this library. Thus, the terms and +conditions of the GNU General Public License cover the whole +combination. + +As a special exception, the copyright holders of this library give you +permission to link this library with independent modules to produce an +executable, regardless of the license terms of these independent +modules, and to copy and distribute the resulting executable under +terms of your choice, provided that you also meet, for each linked +independent module, the terms and conditions of the license of that +module. An independent module is a module which is not derived from +or based on this library. If you modify this library, you may extend +this exception to your version of the library, but you are not +obligated to do so. If you do not wish to do so, delete this +exception statement from your version. */ + +#include <unistd.h> +#include <sys/types.h> +#include <pwd.h> +#include <cstdio> +#include <cstdlib> +#include <string> +#include <functional> +#include <cctype> +#include <locale> +#include <iostream> +#include <fstream> + + +#include "IcedTeaPluginUtils.h" + +#include "IcedTeaParseProperties.h" +/* + The public api is nearly impossible to test due to "hardcoded paths" + All public methods have theirs equivalents wit set-up-able files, and those are + tested. +*/ + +using namespace std; +//private api + +void remove_all_spaces(string& str); +bool get_property_value(string c, string& dest); +bool starts_with(string c1, string c2); +string user_properties_file(); +string main_properties_file(); +string default_java_properties_file(); +//for passing three dummy files +bool find_system_config_file(string main_file, string custom_jre_file, bool usecustom_jre, string default_java_file, string& dest); +bool find_property(string filename, string property, string& dest); +//for passing two dummy files +bool read_deploy_property_value(string user_file, string system_file, bool usesystem_file, string property, string& dest); +//for passing two dummy files +bool find_custom_jre(string user_file, string main_file,string& dest); +//end of non-public IcedTeaParseProperties api + + +void remove_all_spaces(string& str) +{ + for(int i=0; i<str.length(); i++){ + if(str[i] == ' ' || str[i] == '\n' || str[i] == '\t') { + str.erase(i,1); + i--; + } + } +} + +bool get_property_value(string c, string& dest){ + int i = c.find("="); + if (i < 0) return false; + int l = c.length(); + dest = c.substr(i+1, l-i); + IcedTeaPluginUtilities::trim(dest); + return true; +} + + +bool starts_with(string c1, string c2){ + return (c1.find(c2) == 0); +} + + +string user_properties_file(){ + int myuid = getuid(); + struct passwd *mypasswd = getpwuid(myuid); + return string(mypasswd->pw_dir)+"/.icedtea/"+default_file_ITW_deploy_props_name; +} + + +string main_properties_file(){ + return "/etc/.java/deployment/"+default_file_ITW_deploy_props_name; +} + +string default_java_properties_file(){ + return ICEDTEA_WEB_JRE "/lib/"+default_file_ITW_deploy_props_name; +} + + +/* this is the same search done by icedtea-web settings: + try the main file in /etc/.java/deployment + if found, then return this file + try to find setUp jre + if found, then try if this file exists and end + if no jre custom jvm is set, then tries default jre + if its deploy file exists, then return + not found otherwise*/ +bool find_system_config_file(string& dest){ + string jdest; + bool found = find_custom_jre(jdest); + if (found) { + jdest = jdest + "/lib/"+default_file_ITW_deploy_props_name; + } + return find_system_config_file(main_properties_file(), jdest, found, default_java_properties_file(), dest); +} +//abstraction for testing purposes +bool find_system_config_file(string main_file, string custom_jre_file, bool usecustom_jre, string default_java_file, string& dest){ + if (IcedTeaPluginUtilities::file_exists(main_file)) { + dest = main_file; + return true; + } else { + if (usecustom_jre){ + if(IcedTeaPluginUtilities::file_exists(custom_jre_file) ) { + dest = custom_jre_file; + return true; + } + } else { + if(IcedTeaPluginUtilities::file_exists(default_java_file)) { + dest = default_java_file; + return true; + } + } + } +return false; //nothing of above found +} + +//Returns whether property was found, if found stores result in 'dest' +bool find_property(string filename, string property, string& dest){ + string property_matcher(property); + IcedTeaPluginUtilities::trim( property_matcher); + property_matcher= property_matcher+"="; + ifstream input( filename.c_str() ); + for( string line; getline( input, line ); ){ /* read a line */ + string copy = line; + //java tolerates spaces around = char, remove them for matching + remove_all_spaces(copy); + if (starts_with(copy, property_matcher)) { + //provide non-spaced value, trimming is done in get_property_value + get_property_value(line, dest); + return true; + } + } + + return false; + } + + +/* this is reimplementation of itw-settings operations + first check in user's settings, if found, return + then check in global file (see the magic of find_system_config_file)*/ +bool read_deploy_property_value(string property, string& dest){ + string futurefile; + bool found = find_system_config_file(futurefile); + return read_deploy_property_value(user_properties_file(), futurefile, found, property, dest); +} +//abstraction for testing purposes +bool read_deploy_property_value(string user_file, string system_file, bool usesystem_file, string property, string& dest){ + //is it in user's file? + bool found = find_property(user_file, property, dest); + if (found) { + return true; + } + //is it in global file? + if (usesystem_file) { + return find_property(system_file, property, dest); + } + return false; +} + +//This is different from common get property, as it is avoiding to search in *java* +//properties files +bool find_custom_jre(string& dest){ + return find_custom_jre(user_properties_file(), main_properties_file(), dest); +} +//abstraction for testing purposes +bool find_custom_jre(string user_file, string main_file,string& dest){ + string key = custom_jre_key; + if(IcedTeaPluginUtilities::file_exists(user_file)) { + bool a = find_property(user_file, key, dest); + if (a) { + return true; + } + } + if(IcedTeaPluginUtilities::file_exists(main_file)) { + return find_property(main_file, key, dest); + } +return false; +} + + + +int test_main(void){ + cout << ("user's settings file\n"); + cout << user_properties_file(); + cout << ("\nmain settings file:\n"); + cout << (main_properties_file()); + cout << ("\njava settings file \n"); + cout << (default_java_properties_file()); + cout << ("\nsystem config file\n"); + string a1; + find_system_config_file(a1); + cout << a1; + cout << ("\ncustom jre\n"); + string a2; + find_custom_jre(a2); + cout << a2; + cout << ("\nsome custom property\n"); + string a3; + read_deploy_property_value("deployment.security.level", a3); + cout << a3; + cout << ("\n"); + return 0; +} diff --git a/plugin/icedteanp/IcedTeaParseProperties.h b/plugin/icedteanp/IcedTeaParseProperties.h new file mode 100644 index 0000000..7fa054d --- /dev/null +++ b/plugin/icedteanp/IcedTeaParseProperties.h @@ -0,0 +1,53 @@ +/* IcedTeaPluginUtils.h + + Copyright (C) 2013 Red Hat + +This file is part of IcedTea. + +IcedTea is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +IcedTea is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + +You should have received a copy of the GNU General Public License +along with IcedTea; see the file COPYING. If not, write to the +Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301 USA. + +Linking this library statically or dynamically with other modules is +making a combined work based on this library. Thus, the terms and +conditions of the GNU General Public License cover the whole +combination. + +As a special exception, the copyright holders of this library give you +permission to link this library with independent modules to produce an +executable, regardless of the license terms of these independent +modules, and to copy and distribute the resulting executable under +terms of your choice, provided that you also meet, for each linked +independent module, the terms and conditions of the license of that +module. An independent module is a module which is not derived from +or based on this library. If you modify this library, you may extend +this exception to your version of the library, but you are not +obligated to do so. If you do not wish to do so, delete this +exception statement from your version. */ + +/** + * Utility classes for parsing values from properties files + */ +#include <string> + + +//public api +std::string user_properties_file(); +bool find_system_config_file(std::string& dest); +bool find_custom_jre(std::string& dest); +bool read_deploy_property_value(std::string property, std::string& dest); +//half public api +const std::string default_file_ITW_deploy_props_name = "deployment.properties"; +const std::string custom_jre_key = "deployment.jre.dir"; +//end of public api diff --git a/plugin/icedteanp/IcedTeaPluginUtils.cc b/plugin/icedteanp/IcedTeaPluginUtils.cc index 6e41c19..d365b05 100644 --- a/plugin/icedteanp/IcedTeaPluginUtils.cc +++ b/plugin/icedteanp/IcedTeaPluginUtils.cc @@ -39,6 +39,7 @@ exception statement from your version. */ #include "IcedTeaNPPlugin.h" #include "IcedTeaScriptablePluginObject.h" #include "IcedTeaPluginUtils.h" +#include <fstream> /** * Misc. utility functions used by the plugin @@ -1068,6 +1069,21 @@ processAsyncCallQueue(void* param /* ignored */) } while(1); } +void IcedTeaPluginUtilities::trim(std::string& str) { + size_t start = str.find_first_not_of(" \t\n"), end = str.find_last_not_of(" \t\n"); + if (start == std::string::npos) { + return; + } + str = str.substr(start, end - start + 1); +} + +bool IcedTeaPluginUtilities::file_exists(std::string filename) +{ + std::ifstream infile(filename.c_str()); + return infile.good(); +} + + /****************************************** * Begin JavaMessageSender implementation * ****************************************** @@ -1203,3 +1219,4 @@ MessageBus::post(const char* message) PLUGIN_DEBUG("%p unlocked...\n", &msg_queue_mutex); } + diff --git a/plugin/icedteanp/IcedTeaPluginUtils.h b/plugin/icedteanp/IcedTeaPluginUtils.h index a6915c2..2887f46 100644 --- a/plugin/icedteanp/IcedTeaPluginUtils.h +++ b/plugin/icedteanp/IcedTeaPluginUtils.h @@ -279,6 +279,11 @@ class IcedTeaPluginUtilities /* Posts call in async queue and waits till execution completes */ static void callAndWaitForResult(NPP instance, void (*func) (void *), AsyncCallThreadData* data); + + /*cutting whitespaces from end and start of string*/ + static void trim(std::string& str); + static bool file_exists(std::string filename); + }; /* @@ -345,4 +350,6 @@ class MessageBus void post(const char* message); }; + + #endif // __ICEDTEAPLUGINUTILS_H__ diff --git a/tests/cpp-unit-tests/IcedTeaParsePropertiesTest.cc b/tests/cpp-unit-tests/IcedTeaParsePropertiesTest.cc new file mode 100644 index 0000000..321a359 --- /dev/null +++ b/tests/cpp-unit-tests/IcedTeaParsePropertiesTest.cc @@ -0,0 +1,525 @@ +/* Copyright (C) 2012 Red Hat + + This file is part of IcedTea. + + IcedTea is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + IcedTea is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with IcedTea; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA. + + Linking this library statically or dynamically with other modules is + making a combined work based on this library. Thus, the terms and + conditions of the GNU General Public License cover the whole + combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent + modules, and to copy and distribute the resulting executable under + terms of your choice, provided that you also meet, for each linked + independent module, the terms and conditions of the license of that + module. An independent module is a module which is not derived from + or based on this library. If you modify this library, you may extend + this exception to your version of the library, but you are not + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +#include <UnitTest++.h> +#include <unistd.h> +#include <sys/types.h> +#include <pwd.h> +#include <cstdio> +#include <cstdlib> +#include <string> +#include <functional> +#include <cctype> +#include <locale> +#include <iostream> +#include <fstream> +#include "IcedTeaParseProperties.h" + +using namespace std; + +//not exposed via IcedTeaParseProperties but needed +extern void remove_all_spaces(string& str); +extern bool get_property_value(string c, string& dest); +extern bool starts_with(string c1, string c2); +extern string user_properties_file(); +extern string main_properties_file(); +extern string default_java_properties_file(); +//for passing three dummy files +bool find_system_config_file(string main_file, string custom_jre_file, bool usecustom_jre, string default_java_file, string& dest); +bool find_property(string filename, string property, string& dest); +//for passing two dummy files +bool read_deploy_property_value(string user_file, string system_file, bool usesystem_file, string property, string& dest); +//for passing two dummy files +bool find_custom_jre(string user_file, string main_file,string& dest); +//end of non-public IcedTeaParseProperties api + +/* Creates a temporary file with the specified contents */ +static string temporary_file(const string& contents) { + string path = tmpnam(NULL); /* POSIX function, fine for test suite */ + ofstream myfile; + myfile.open (path.c_str()); + myfile << contents; + myfile.close(); + return path; +} + + + +/*private api fundamental tests*/ +TEST(RemoveAllSpaces) { + string toBeTrimmed = string(" te st X "); + remove_all_spaces (toBeTrimmed); + CHECK_EQUAL("testX", toBeTrimmed); + + string toBeTrimmed1 = string(" te st X "); + remove_all_spaces (toBeTrimmed1); + CHECK_EQUAL("testX", toBeTrimmed1); + + string toBeTrimmed2 = string(" \t t e\nst\tX\n"); + remove_all_spaces (toBeTrimmed2); + CHECK_EQUAL("testX", toBeTrimmed2); + + string toBeTrimmed3 = string(" \t \n te \n stX\n"); + remove_all_spaces (toBeTrimmed3); + CHECK_EQUAL("testX", toBeTrimmed3); + +} + + +TEST(get_property_value) { + string dest = string(""); + bool a = get_property_value("key.key=value+eulav ",dest); + CHECK_EQUAL("value+eulav", dest); + CHECK_EQUAL(a, true); + + dest = string(""); + a = get_property_value("horrible key = value/value",dest); + CHECK_EQUAL("value/value", dest); + CHECK_EQUAL(a, true); + + dest = string(""); + a = get_property_value("better.key = but very horrible value ",dest); + CHECK_EQUAL("but very horrible value", dest); + CHECK_EQUAL(a, true); + + dest = string(""); + a = get_property_value("better.key but errornous value ",dest); + CHECK_EQUAL("", dest); + CHECK_EQUAL(a, false); +} + +TEST(starts_with) { + bool a = starts_with("aa bb cc","aa b"); + CHECK_EQUAL(a, true); + + a = starts_with("aa bb cc","aab"); + CHECK_EQUAL(a, false); +} + + +TEST(user_properties_file) { + string f = user_properties_file(); + CHECK_EQUAL(f.find(".icedtea") >= 0, true); + CHECK_EQUAL(f.find(default_file_ITW_deploy_props_name) >= 0, true); +} + +TEST(main_properties_file) { + string f = main_properties_file(); + CHECK_EQUAL(f.find(default_file_ITW_deploy_props_name) >= 0, true); + CHECK_EQUAL(f.find(".java") >= 0, true); +} + +TEST(default_java_properties_file) { + string f = default_java_properties_file(); + CHECK_EQUAL(f.find(default_file_ITW_deploy_props_name) >= 0, true); + CHECK_EQUAL(f.find("lib") >= 0, true); +} + + +TEST(find_system_config_file) { + string f1 = temporary_file("key1=value1"); + string f2 = temporary_file("key2=value2"); + string f3 = temporary_file("key3=value3"); + string dest=string(""); + find_system_config_file(f1, f2, true, f3, dest); + CHECK_EQUAL(f1, dest); + dest=string(""); + find_system_config_file(f1, f2, false, f3, dest); + CHECK_EQUAL(f1, dest); + + remove(f1.c_str()); + dest=string(""); + find_system_config_file(f1, f2, true, f3, dest); + CHECK_EQUAL(f2, dest); + dest=string(""); + find_system_config_file(f1, f2, false, f3, dest); + CHECK_EQUAL(f3, dest); + + remove(f2.c_str()); + dest=string(""); + find_system_config_file(f1, f2, true, f3, dest); + CHECK_EQUAL("", dest); //forcing not existing f2 + dest=string(""); + find_system_config_file(f1, f2, false, f3, dest); + CHECK_EQUAL(f3, dest); + + remove(f3.c_str()); + dest=string(""); + find_system_config_file(f1, f2, true, f3, dest); + CHECK_EQUAL("", dest); + dest=string(""); + find_system_config_file(f1, f2, true, f3, dest); + CHECK_EQUAL("", dest); +} + +TEST(find_property) { + string f1 = temporary_file("key1=value1"); + string dest=string(""); + find_property(f1, "key1", dest); + CHECK_EQUAL("value1", dest); + dest=string(""); + find_property(f1, "key2", dest); + CHECK_EQUAL("", dest); + dest=string(""); + find_property(f1, "value1", dest); + CHECK_EQUAL("", dest); + remove(f1.c_str()); + + string f2 = temporary_file("key2 =value2 key3=value3\n key5 = value5"); + dest=string(""); + find_property(f2, "key2", dest); + CHECK_EQUAL("value2 key3=value3", dest); + dest=string(""); + find_property(f2, "key1", dest); + CHECK_EQUAL("", dest); + dest=string(""); + find_property(f2, "key3", dest); + CHECK_EQUAL("", dest); + dest=string(""); + find_property(f2, "key5", dest); + CHECK_EQUAL("value5", dest); + remove(f2.c_str()); + + string f3 = temporary_file("ke.y3= value3\nkey4=value4"); + dest=string(""); + find_property(f3, "ke.y3", dest); + CHECK_EQUAL("value3", dest); + dest=string(""); + find_property(f3, "key4", dest); + CHECK_EQUAL("value4", dest); + remove(f3.c_str()); +} + +TEST(read_deploy_property_value1) { + string f1 = temporary_file("key1=value11"); + string f2 = temporary_file("key1=value12"); + string f3 = temporary_file("key2=value23"); + string dest=string(""); + read_deploy_property_value(f1,f2,true, "key1", dest); + CHECK_EQUAL("value11", dest); + dest=string(""); + read_deploy_property_value(f2,f1,true, "key1", dest); + CHECK_EQUAL("value12", dest); + dest=string(""); + read_deploy_property_value(f1,f3,true, "key1", dest); + CHECK_EQUAL("value11", dest); + dest=string(""); + read_deploy_property_value(f3,f1,true, "key1", dest); + CHECK_EQUAL("value11", dest); + read_deploy_property_value(f3,f2,true, "key1", dest); + CHECK_EQUAL("value12", dest); + dest=string(""); + read_deploy_property_value(f2,f3,true, "key1", dest); + CHECK_EQUAL("value12", dest); + + dest=string(""); + read_deploy_property_value(f1,f2,true, "key2", dest); + CHECK_EQUAL("", dest); + dest=string(""); + read_deploy_property_value(f2,f1,true, "key2", dest); + CHECK_EQUAL("", dest); + dest=string(""); + read_deploy_property_value(f1,f3,true, "key2", dest); + CHECK_EQUAL("value23", dest); + dest=string(""); + read_deploy_property_value(f3,f1,true, "key2", dest); + CHECK_EQUAL("value23", dest); + read_deploy_property_value(f3,f2,true, "key2", dest); + CHECK_EQUAL("value23", dest); + dest=string(""); + read_deploy_property_value(f2,f3,true, "key2", dest); + CHECK_EQUAL("value23", dest); + + remove(f1.c_str());///////////////////////////////// + dest=string(""); + read_deploy_property_value(f1,f2,true, "key1", dest); + CHECK_EQUAL("value12", dest); + dest=string(""); + read_deploy_property_value(f2,f1,true, "key1", dest); + CHECK_EQUAL("value12", dest); + dest=string(""); + read_deploy_property_value(f1,f3,true, "key1", dest); + CHECK_EQUAL("", dest); + dest=string(""); + read_deploy_property_value(f3,f1,true, "key1", dest); + CHECK_EQUAL("", dest); + read_deploy_property_value(f3,f2,true, "key1", dest); + CHECK_EQUAL("value12", dest); + dest=string(""); + read_deploy_property_value(f2,f3,true, "key1", dest); + CHECK_EQUAL("value12", dest); + + dest=string(""); + read_deploy_property_value(f1,f2,true, "key2", dest); + CHECK_EQUAL("", dest); + dest=string(""); + read_deploy_property_value(f2,f1,true, "key2", dest); + CHECK_EQUAL("", dest); + dest=string(""); + read_deploy_property_value(f1,f3,true, "key2", dest); + CHECK_EQUAL("value23", dest); + dest=string(""); + read_deploy_property_value(f3,f1,true, "key2", dest); + CHECK_EQUAL("value23", dest); + read_deploy_property_value(f3,f2,true, "key2", dest); + CHECK_EQUAL("value23", dest); + dest=string(""); + read_deploy_property_value(f2,f3,true, "key2", dest); + CHECK_EQUAL("value23", dest); + + remove(f3.c_str());///////////////////////////////// + dest=string(""); + read_deploy_property_value(f1,f2,true, "key1", dest); + CHECK_EQUAL("value12", dest); + dest=string(""); + read_deploy_property_value(f2,f1,true, "key1", dest); + CHECK_EQUAL("value12", dest); + dest=string(""); + read_deploy_property_value(f1,f3,true, "key1", dest); + CHECK_EQUAL("", dest); + dest=string(""); + read_deploy_property_value(f3,f1,true, "key1", dest); + CHECK_EQUAL("", dest); + read_deploy_property_value(f3,f2,true, "key1", dest); + CHECK_EQUAL("value12", dest); + dest=string(""); + read_deploy_property_value(f2,f3,true, "key1", dest); + CHECK_EQUAL("value12", dest); + + dest=string(""); + read_deploy_property_value(f1,f2,true, "key2", dest); + CHECK_EQUAL("", dest); + dest=string(""); + read_deploy_property_value(f2,f1,true, "key2", dest); + CHECK_EQUAL("", dest); + dest=string(""); + read_deploy_property_value(f1,f3,true, "key2", dest); + CHECK_EQUAL("", dest); + dest=string(""); + read_deploy_property_value(f3,f1,true, "key2", dest); + CHECK_EQUAL("", dest); + read_deploy_property_value(f3,f2,true, "key2", dest); + CHECK_EQUAL("", dest); + dest=string(""); + read_deploy_property_value(f2,f3,true, "key2", dest); + CHECK_EQUAL("", dest); + + remove(f2.c_str());///////////////////////////////// + +} + + + +TEST(read_deploy_property_value2) { + string f1 = temporary_file("key1=value11"); + string f2 = temporary_file("key1=value12"); + string f3 = temporary_file("key2=value23"); + string dest=string(""); + read_deploy_property_value(f1,f2,false, "key1", dest); + CHECK_EQUAL("value11", dest); + dest=string(""); + read_deploy_property_value(f2,f1,false, "key1", dest); + CHECK_EQUAL("value12", dest); + dest=string(""); + read_deploy_property_value(f1,f3,false, "key1", dest); + CHECK_EQUAL("value11", dest); + dest=string(""); + read_deploy_property_value(f3,f1,false, "key1", dest); + CHECK_EQUAL("", dest); + read_deploy_property_value(f3,f2,false, "key1", dest); + CHECK_EQUAL("", dest); + dest=string(""); + read_deploy_property_value(f2,f3,false, "key1", dest); + CHECK_EQUAL("value12", dest); + + dest=string(""); + read_deploy_property_value(f1,f2,false, "key2", dest); + CHECK_EQUAL("", dest); + dest=string(""); + read_deploy_property_value(f2,f1,false, "key2", dest); + CHECK_EQUAL("", dest); + dest=string(""); + read_deploy_property_value(f1,f3,false, "key2", dest); + CHECK_EQUAL("", dest); + dest=string(""); + read_deploy_property_value(f3,f1,false, "key2", dest); + CHECK_EQUAL("value23", dest); + read_deploy_property_value(f3,f2,false, "key2", dest); + CHECK_EQUAL("value23", dest); + dest=string(""); + read_deploy_property_value(f2,f3,false, "key2", dest); + CHECK_EQUAL("", dest); + + remove(f1.c_str());///////////////////////////////// + dest=string(""); + read_deploy_property_value(f1,f2,false, "key1", dest); + CHECK_EQUAL("", dest); + dest=string(""); + read_deploy_property_value(f2,f1,false, "key1", dest); + CHECK_EQUAL("value12", dest); + dest=string(""); + read_deploy_property_value(f1,f3,false, "key1", dest); + CHECK_EQUAL("", dest); + dest=string(""); + read_deploy_property_value(f3,f1,false, "key1", dest); + CHECK_EQUAL("", dest); + read_deploy_property_value(f3,f2,false, "key1", dest); + CHECK_EQUAL("", dest); + dest=string(""); + read_deploy_property_value(f2,f3,false, "key1", dest); + CHECK_EQUAL("value12", dest); + + dest=string(""); + read_deploy_property_value(f1,f2,false, "key2", dest); + CHECK_EQUAL("", dest); + dest=string(""); + read_deploy_property_value(f2,f1,false, "key2", dest); + CHECK_EQUAL("", dest); + dest=string(""); + read_deploy_property_value(f1,f3,false, "key2", dest); + CHECK_EQUAL("", dest); + dest=string(""); + read_deploy_property_value(f3,f1,false, "key2", dest); + CHECK_EQUAL("value23", dest); + read_deploy_property_value(f3,f2,false, "key2", dest); + CHECK_EQUAL("value23", dest); + dest=string(""); + read_deploy_property_value(f2,f3,false, "key2", dest); + CHECK_EQUAL("", dest); + + remove(f3.c_str());///////////////////////////////// + dest=string(""); + read_deploy_property_value(f1,f2,false, "key1", dest); + CHECK_EQUAL("", dest); + dest=string(""); + read_deploy_property_value(f2,f1,false, "key1", dest); + CHECK_EQUAL("value12", dest); + dest=string(""); + read_deploy_property_value(f1,f3,false, "key1", dest); + CHECK_EQUAL("", dest); + dest=string(""); + read_deploy_property_value(f3,f1,false, "key1", dest); + CHECK_EQUAL("", dest); + read_deploy_property_value(f3,f2,false, "key1", dest); + CHECK_EQUAL("", dest); + dest=string(""); + read_deploy_property_value(f2,f3,false, "key1", dest); + CHECK_EQUAL("value12", dest); + + dest=string(""); + read_deploy_property_value(f1,f2,false, "key2", dest); + CHECK_EQUAL("", dest); + dest=string(""); + read_deploy_property_value(f2,f1,false, "key2", dest); + CHECK_EQUAL("", dest); + dest=string(""); + read_deploy_property_value(f1,f3,false, "key2", dest); + CHECK_EQUAL("", dest); + dest=string(""); + read_deploy_property_value(f3,f1,false, "key2", dest); + CHECK_EQUAL("", dest); + read_deploy_property_value(f3,f2,false, "key2", dest); + CHECK_EQUAL("", dest); + dest=string(""); + read_deploy_property_value(f2,f3,false, "key2", dest); + CHECK_EQUAL("", dest); + + remove(f2.c_str());///////////////////////////////// +} + + +TEST(find_custom_jre) { + string f1 = temporary_file(custom_jre_key+"=value11"); + string f2 = temporary_file(custom_jre_key+"=value12"); + string f3 = temporary_file("key2=value23"); + string f4 = temporary_file("key2=value24"); + string dest=string(""); + find_custom_jre(f1,f2, dest); + CHECK_EQUAL("value11", dest); + dest=string(""); + find_custom_jre(f2,f1, dest); + CHECK_EQUAL("value12", dest); + dest=string(""); + find_custom_jre(f1,f3, dest); + CHECK_EQUAL("value11", dest); + dest=string(""); + find_custom_jre(f3,f1, dest); + CHECK_EQUAL("value11", dest); + dest=string(""); + find_custom_jre(f3,f4, dest); + CHECK_EQUAL("", dest); + remove(f1.c_str());///////////////////////////////// + dest=string(""); + find_custom_jre(f1,f2, dest); + CHECK_EQUAL("value12", dest); + dest=string(""); + find_custom_jre(f2,f1, dest); + CHECK_EQUAL("value12", dest); + dest=string(""); + find_custom_jre(f1,f3, dest); + CHECK_EQUAL("", dest); + dest=string(""); + find_custom_jre(f3,f1, dest); + CHECK_EQUAL("", dest); + remove(f3.c_str());///////////////////////////////// + dest=string(""); + find_custom_jre(f1,f2, dest); + CHECK_EQUAL("value12", dest); + dest=string(""); + find_custom_jre(f2,f1, dest); + CHECK_EQUAL("value12", dest); + dest=string(""); + find_custom_jre(f1,f3, dest); + CHECK_EQUAL("", dest); + dest=string(""); + find_custom_jre(f3,f1, dest); + CHECK_EQUAL("", dest); + remove(f2.c_str());///////////////////////////////// + dest=string(""); + find_custom_jre(f1,f2, dest); + CHECK_EQUAL("", dest); + dest=string(""); + find_custom_jre(f2,f1, dest); + CHECK_EQUAL("", dest); + dest=string(""); + find_custom_jre(f1,f3, dest); + CHECK_EQUAL("", dest); + dest=string(""); + find_custom_jre(f3,f1, dest); + CHECK_EQUAL("", dest); + remove(f4.c_str());///////////////////////////////// + +} diff --git a/tests/cpp-unit-tests/IcedTeaPluginUtilsTest.cc b/tests/cpp-unit-tests/IcedTeaPluginUtilsTest.cc index 1ad1698..dc16bd2 100644 --- a/tests/cpp-unit-tests/IcedTeaPluginUtilsTest.cc +++ b/tests/cpp-unit-tests/IcedTeaPluginUtilsTest.cc @@ -42,6 +42,10 @@ #include "IcedTeaPluginUtils.h" #include "IcedTeaNPPlugin.h" +#include <fstream> + +extern void trim(std::string& str); +extern bool file_exists(std::string filename); TEST(NPVariantAsString) { NPVariant var; @@ -82,3 +86,39 @@ TEST(NPVariantStringCopy) { CHECK_EQUAL(0, browsermock_unfreed_allocations()); } + +TEST(trim) { + std::string toBeTrimmed = std::string(" testX "); + IcedTeaPluginUtilities::trim (toBeTrimmed); + CHECK_EQUAL("testX", toBeTrimmed); + + std::string toBeTrimmed2 = std::string(" \t testX\n"); + IcedTeaPluginUtilities::trim (toBeTrimmed2); + CHECK_EQUAL("testX", toBeTrimmed2); + + std::string toBeTrimmed3 = std::string(" \t \n te \n stX\n"); + IcedTeaPluginUtilities::trim (toBeTrimmed3); + CHECK_EQUAL("te \n stX", toBeTrimmed3); +} + + +/* Creates a temporary file with the specified contents */ +static std::string temporary_file(const std::string& contents) { + std::string path = tmpnam(NULL); /* POSIX function, fine for test suite */ + std::ofstream myfile; + myfile.open (path.c_str()); + myfile << contents; + myfile.close(); + return path; +} + + +TEST(file_exists) { + std::string f1 = temporary_file("dummy content"); + bool a = IcedTeaPluginUtilities::file_exists(f1); + CHECK_EQUAL(a, true); + + remove(f1.c_str()); + bool b = IcedTeaPluginUtilities::file_exists(f1); + CHECK_EQUAL(b, false); +} |