#include "support.h"

START_TEST (env_create)
{
	char *testbed = setup_testbed(NULL);
	
	OSyncEnv *os_env = osync_env_new();
	fail_unless(os_env != NULL, NULL);
	osync_env_free(os_env);
	
	destroy_testbed(testbed);
}
END_TEST

START_TEST (env_init)
{
  char *testbed = setup_testbed("env_init");
  
  OSyncEnv *env = osync_env_new();
  fail_unless(env != NULL, NULL);
  
  osync_env_set_option(env, "GROUPS_DIRECTORY", "configs");
  osync_env_set_option(env, "LOAD_PLUGINS", "FALSE");
  
  fail_unless(osync_env_initialize(env, NULL), NULL);
  
  fail_unless(osync_env_finalize(env, NULL), NULL);
  osync_env_free(env);
  
  destroy_testbed(testbed);
}
END_TEST

START_TEST (env_double_init)
{
  char *testbed = setup_testbed("env_init");
  OSyncEnv *env = osync_env_new();
  fail_unless(env != NULL, NULL);
  
  osync_env_set_option(env, "GROUPS_DIRECTORY", "configs");
  osync_env_set_option(env, "LOAD_PLUGINS", "FALSE");
  fail_unless(osync_env_initialize(env, NULL), NULL);
  fail_unless(!osync_env_initialize(env, NULL), NULL);
  
  fail_unless(osync_env_finalize(env, NULL), NULL);
  osync_env_free(env);
  destroy_testbed(testbed);
}
END_TEST

START_TEST (env_pre_fin)
{
  char *testbed = setup_testbed("env_init");
  OSyncEnv *env = osync_env_new();
  fail_unless(env != NULL, NULL);
  
  osync_env_set_option(env, "GROUPS_DIRECTORY", "configs");
  
  fail_unless(!osync_env_finalize(env, NULL), NULL);
  osync_env_free(env);
  destroy_testbed(testbed);
}
END_TEST


START_TEST (env_init_false)
{
  char *testbed = setup_testbed("sync_setup_false");
  OSyncEnv *osync = osync_env_new();
  osync_env_set_option(osync, "GROUPS_DIRECTORY", "configs");
  osync_env_set_option(osync, "LOAD_PLUGINS", "FALSE");
  OSyncError *error = NULL;
  osync_env_initialize(osync, &error);
  fail_unless(osync_env_num_groups(osync) == 1, NULL);
  destroy_testbed(testbed);
}
END_TEST

START_TEST (env_init_false2)
{
  char *testbed = setup_testbed("sync_setup_false");
  OSyncEnv *osync = init_env();
  OSyncGroup *group = osync_group_load(osync, "configs/group", NULL);
  fail_unless(group != NULL, NULL);
  fail_unless(osync_env_num_groups(osync) == 1, NULL);
  destroy_testbed(testbed);
}
END_TEST

/* FIXME:
   create a _intended_ test bed for sync_false which breaks:
   osengine_init()
   synchronize_once()
*/   
#if 0
START_TEST (env_sync_false)
{
	char *testbed = setup_testbed("sync_setup_false");
	OSyncEnv *env = init_env();

	OSyncGroup *group = osync_group_load(env, "configs/group", NULL);
	fail_unless(group != NULL, NULL);

	OSyncEngine *engine = osengine_new(group, NULL);

	OSyncError *error = NULL;

	fail_unless(!osengine_init(engine, &error), NULL);
	fail_unless(!synchronize_once(engine, NULL), NULL);

	osengine_finalize(engine);
	osengine_free(engine);

	group = NULL;
	osync_env_finalize(env, NULL);
	osync_env_free(env);
	
	destroy_testbed(testbed);
}
END_TEST
#endif

START_TEST (env_check_plugin_true1)
{
	char *testbed = setup_testbed(NULL);
	OSyncEnv *env = init_env();
	
	OSyncError *error = NULL;
	fail_unless(osync_env_plugin_is_usable(env, "file-sync", &error), NULL);
	fail_unless(!osync_error_is_set(&error), NULL);
	
	osync_env_free(env);
	destroy_testbed(testbed);
}
END_TEST

START_TEST (env_check_plugin_true2)
{
	char *testbed = setup_testbed(NULL);
	setenv("IS_AVAILABLE", "1", TRUE);
	
	OSyncEnv *env = init_env();
	
	OSyncError *error = NULL;
	
	fail_unless(osync_env_plugin_is_usable(env, "file-sync", &error), NULL);
	fail_unless(!osync_error_is_set(&error), NULL);
	
	osync_env_free(env);
	destroy_testbed(testbed);
}
END_TEST

START_TEST (env_check_plugin_false)
{
	char *testbed = setup_testbed(NULL);
	OSyncEnv *env = init_env();
	
	OSyncError *error = NULL;
	fail_unless(!osync_env_plugin_is_usable(env, "file-syncc", &error), NULL);
	fail_unless(osync_error_is_set(&error), NULL);
	
	osync_env_free(env);
	destroy_testbed(testbed);
}
END_TEST

START_TEST (env_check_plugin_false2)
{
	char *testbed = setup_testbed(NULL);
	setenv("IS_AVAILABLE", "1", TRUE);
	setenv("IS_NOT_AVAILABLE", "1", TRUE);
	
	OSyncEnv *env = init_env();
	
	OSyncError *error = NULL;

	fail_unless(!osync_env_plugin_is_usable(env, "file-sync", &error), NULL);
	fail_unless(osync_error_is_set(&error), NULL);
	
	osync_env_free(env);
	destroy_testbed(testbed);
}
END_TEST

Suite *env_suite(void)
{
	Suite *s = suite_create("Env");
	//Suite *s2 = suite_create("Env");
	create_case(s, "env_create", env_create);
	create_case(s, "env_init", env_init);
	create_case(s, "env_double_init", env_double_init);
	create_case(s, "env_pre_fin", env_pre_fin);
	create_case(s, "env_init_false", env_init_false);
	create_case(s, "env_init_false2", env_init_false2);
//	create_case(s, "env_sync_false", env_sync_false);
	create_case(s, "env_check_plugin_true1", env_check_plugin_true1);
	create_case(s, "env_check_plugin_true2", env_check_plugin_true2);
	create_case(s, "env_check_plugin_false", env_check_plugin_false);
	create_case(s, "env_check_plugin_false2", env_check_plugin_false2);

	return s;
}

int main(void)
{
	int nf;
	
	Suite *s = env_suite();
	
	SRunner *sr;
	sr = srunner_create(s);

//	srunner_set_fork_status (sr, CK_NOFORK);
	srunner_run_all(sr, CK_NORMAL);
	nf = srunner_ntests_failed(sr);
	srunner_free(sr);
	return (nf == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
}


syntax highlighted by Code2HTML, v. 0.9.1