aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJiri Vanek <[email protected]>2013-03-28 15:51:38 +0100
committerJiri Vanek <[email protected]>2013-03-28 15:51:38 +0100
commit8d2d31514295a2d0eff5971887246f6d4211fc6d (patch)
treed66ce4fb57c823a2aa8894bb6894b33bdbe162f6
parent58b4d6e3dc3a95cfbc6f369287aca04763522e48 (diff)
Added code to parse properties and to find correct configuration files from c++ part of plugin.
-rw-r--r--ChangeLog15
-rw-r--r--Makefile.am4
-rw-r--r--plugin/icedteanp/IcedTeaParseProperties.cc244
-rw-r--r--plugin/icedteanp/IcedTeaParseProperties.h53
-rw-r--r--plugin/icedteanp/IcedTeaPluginUtils.cc17
-rw-r--r--plugin/icedteanp/IcedTeaPluginUtils.h7
-rw-r--r--tests/cpp-unit-tests/IcedTeaParsePropertiesTest.cc525
-rw-r--r--tests/cpp-unit-tests/IcedTeaPluginUtilsTest.cc40
8 files changed, 903 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index f342cef..b2b4dd9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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);
+}