merge with master.
[ardour.git] / libs / pbd / test / filesystem_test.cc
1 #include "filesystem_test.h"
2
3 #include <unistd.h>
4 #include <stdlib.h>
5
6 #include <glibmm/miscutils.h>
7 #include <glibmm/fileutils.h>
8
9 #include "pbd/file_utils.h"
10
11 #include "test_common.h"
12
13 using namespace std;
14 using namespace PBD;
15
16 CPPUNIT_TEST_SUITE_REGISTRATION (FilesystemTest);
17
18 void
19 FilesystemTest::testPathIsWithin ()
20 {
21 #ifndef PLATFORM_WINDOWS
22         system ("rm -r foo");
23         CPPUNIT_ASSERT (g_mkdir_with_parents ("foo/bar/baz", 0755) == 0);
24
25         CPPUNIT_ASSERT (PBD::path_is_within ("foo/bar/baz", "foo/bar/baz"));
26         CPPUNIT_ASSERT (PBD::path_is_within ("foo/bar", "foo/bar/baz"));
27         CPPUNIT_ASSERT (PBD::path_is_within ("foo", "foo/bar/baz"));
28         CPPUNIT_ASSERT (PBD::path_is_within ("foo/bar", "foo/bar/baz"));
29         CPPUNIT_ASSERT (PBD::path_is_within ("foo/bar", "foo/bar"));
30
31         CPPUNIT_ASSERT (PBD::path_is_within ("foo/bar/baz", "frobozz") == false);
32
33         int const r = symlink ("bar", "foo/jim");
34         CPPUNIT_ASSERT (r == 0);
35
36         CPPUNIT_ASSERT (PBD::path_is_within ("foo/bar/baz", "foo/bar/baz"));
37         CPPUNIT_ASSERT (PBD::path_is_within ("foo/bar", "foo/bar/baz"));
38         CPPUNIT_ASSERT (PBD::path_is_within ("foo", "foo/bar/baz"));
39         CPPUNIT_ASSERT (PBD::path_is_within ("foo/bar", "foo/bar/baz"));
40         CPPUNIT_ASSERT (PBD::path_is_within ("foo/bar", "foo/bar"));
41
42         CPPUNIT_ASSERT (PBD::path_is_within ("foo/jim/baz", "frobozz") == false);
43 #endif
44 }
45
46 void
47 FilesystemTest::testCopyFileASCIIFilename ()
48 {
49         string testdata_path;
50         CPPUNIT_ASSERT (find_file (test_search_path (), "RosegardenPatchFile.xml", testdata_path));
51
52         string output_path = test_output_directory ("CopyFile");
53
54         output_path = Glib::build_filename (output_path, "RosegardenPatchFile.xml");
55
56         cerr << endl;
57         cerr << "CopyFile test output path: " << output_path << endl;
58
59         CPPUNIT_ASSERT (PBD::copy_file (testdata_path, output_path));
60 }
61
62 void
63 FilesystemTest::testCopyFileUTF8Filename ()
64 {
65         vector<string> i18n_files;
66
67         Searchpath i18n_path(test_search_path());
68         i18n_path.add_subdirectory_to_paths("i18n_test");
69
70         PBD::find_files_matching_pattern (i18n_files, i18n_path, "*.tst");
71
72         cerr << endl;
73         cerr << "Copying " << i18n_files.size() << " test files from: "
74              << i18n_path.to_string () << endl;
75
76         for (vector<string>::iterator i = i18n_files.begin(); i != i18n_files.end(); ++i) {
77                 string input_path = *i;
78                 string output_file = Glib::path_get_basename(*i);
79                 string output_path = test_output_directory ("CopyFile");
80                 output_path = Glib::build_filename (output_path, output_file);
81
82                 cerr << "Copying test file: " << input_path
83                      << " To " << output_path << endl;
84
85                 CPPUNIT_ASSERT (PBD::copy_file (input_path, output_path));
86         }
87 }
88
89 void
90 FilesystemTest::testFindFilesMatchingPattern ()
91 {
92         vector<string> patch_files;
93
94         PBD::find_files_matching_pattern (patch_files, test_search_path (), "*PatchFile*");
95
96         CPPUNIT_ASSERT(test_search_path ().size() == 1);
97
98         CPPUNIT_ASSERT(patch_files.size() == 2);
99 }
100
101 string
102 create_test_directory (std::string test_dir)
103 {
104         vector<string> test_files;
105         vector<string> i18n_files;
106
107         Searchpath spath(test_search_path());
108         PBD::get_files (test_files, spath);
109
110         spath.add_subdirectory_to_paths("i18n_test");
111
112         PBD::get_files (i18n_files, spath);
113
114         string output_dir = test_output_directory (test_dir);
115
116         CPPUNIT_ASSERT (test_search_path().size () != 0);
117
118         string test_dir_path = test_search_path()[0];
119
120         cerr << endl;
121         cerr << "Copying " << test_files.size() << " test files from: "
122              << test_dir_path << " to " << output_dir << endl;
123
124         PBD::copy_files (test_dir_path, output_dir);
125
126         vector<string> copied_files;
127
128         PBD::get_files (copied_files, output_dir);
129
130         CPPUNIT_ASSERT (copied_files.size() == test_files.size());
131
132         string subdir_path = Glib::build_filename (output_dir, "subdir");
133
134         CPPUNIT_ASSERT (g_mkdir_with_parents (subdir_path.c_str(), 0755) == 0);
135
136         cerr << endl;
137         cerr << "Copying " << i18n_files.size() << " i18n test files to: "
138              << subdir_path << endl;
139
140         for (vector<string>::iterator i = i18n_files.begin(); i != i18n_files.end(); ++i) {
141                 string input_filepath = *i;
142                 string output_filename = Glib::path_get_basename(*i);
143                 string output_filepath = Glib::build_filename (subdir_path, output_filename);
144
145                 CPPUNIT_ASSERT (PBD::copy_file (input_filepath, output_filepath));
146         }
147
148         copied_files.clear();
149         PBD::get_files (copied_files, subdir_path);
150
151         CPPUNIT_ASSERT (copied_files.size() == i18n_files.size());
152
153         return output_dir;
154 }
155
156 void
157 FilesystemTest::testClearDirectory ()
158 {
159         string output_dir_path = create_test_directory ("ClearDirectory");
160
161         vector<string> files_in_output_dir;
162
163         PBD::get_paths (files_in_output_dir, output_dir_path, true, true);
164
165         size_t removed_file_size = 0;
166         vector<string> removed_files;
167
168         CPPUNIT_ASSERT (PBD::clear_directory (output_dir_path, &removed_file_size, &removed_files) ==0);
169
170         cerr << "Removed " << removed_files.size() << " files of total size: "
171              << removed_file_size << endl;
172
173         CPPUNIT_ASSERT (removed_files.size () == files_in_output_dir.size ());
174
175         string subdir_path = Glib::build_filename (output_dir_path, "subdir");
176
177         // make sure the directory structure is still there
178         CPPUNIT_ASSERT (Glib::file_test (subdir_path, Glib::FILE_TEST_IS_DIR));
179 }
180
181 void
182 FilesystemTest::testRemoveDirectory ()
183 {
184         string output_dir_path = create_test_directory ("RemoveDirectory");
185
186         vector<string> files_in_output_dir;
187
188         PBD::get_paths (files_in_output_dir, output_dir_path, false, true);
189
190         CPPUNIT_ASSERT (files_in_output_dir.size () != 0);
191
192         PBD::remove_directory (output_dir_path);
193
194         // doesn't actually remove directory though...just contents
195         CPPUNIT_ASSERT (Glib::file_test (output_dir_path, Glib::FILE_TEST_IS_DIR));
196
197         files_in_output_dir.clear ();
198
199         PBD::get_paths (files_in_output_dir, output_dir_path, false, true);
200
201         CPPUNIT_ASSERT (files_in_output_dir.size () == 0);
202 }