d64fe77f7fc84a0508456624eddc058de352b2ba
[ardour.git] / libs / ardour / test / session_test.cc
1
2 #include <glibmm/fileutils.h>
3 #include <glibmm/miscutils.h>
4
5 #include <stdexcept>
6
7 #include "pbd/textreceiver.h"
8 #include "pbd/file_utils.h"
9 #include "ardour/session.h"
10 #include "ardour/audioengine.h"
11 #include "ardour/smf_source.h"
12 #include "ardour/midi_model.h"
13
14 #include "test_util.h"
15
16 #include "session_test.h"
17
18 CPPUNIT_TEST_SUITE_REGISTRATION (SessionTest);
19
20 using namespace std;
21 using namespace ARDOUR;
22 using namespace PBD;
23
24 void
25 SessionTest::new_session ()
26 {
27         const string session_name("test_session");
28         std::string new_session_dir = Glib::build_filename (new_test_output_dir(), session_name);
29
30         CPPUNIT_ASSERT (!Glib::file_test (new_session_dir, Glib::FILE_TEST_EXISTS));
31
32         create_and_start_dummy_backend ();
33
34         ARDOUR::Session* new_session = load_session (new_session_dir, "test_session");
35
36         CPPUNIT_ASSERT (new_session);
37
38         new_session->save_state ("");
39
40         delete new_session;
41         stop_and_destroy_backend ();
42 }
43
44 void
45 SessionTest::new_session_from_template ()
46 {
47         const string session_name("two_tracks");
48         const string session_template_dir_name("2 Track-template");
49
50         std::string new_session_dir = Glib::build_filename (new_test_output_dir(), session_name);
51
52         CPPUNIT_ASSERT (!Glib::file_test (new_session_dir, Glib::FILE_TEST_EXISTS));
53
54         std::string session_template_dir = test_search_path ().front ();
55         session_template_dir = Glib::build_filename (session_template_dir, "2 Track-template");
56
57         CPPUNIT_ASSERT (Glib::file_test (session_template_dir, Glib::FILE_TEST_IS_DIR));
58
59         Session* new_session = 0;
60         BusProfile* bus_profile = 0;
61
62         create_and_start_dummy_backend ();
63
64         // create a new session based on session template
65         new_session = new Session (*AudioEngine::instance (), new_session_dir, session_name,
66                                 bus_profile, session_template_dir);
67
68         CPPUNIT_ASSERT (new_session);
69
70         new_session->save_state ("");
71
72         delete new_session;
73         stop_and_destroy_backend ();
74
75         // keep the same audio backend
76         create_and_start_dummy_backend ();
77
78         Session* template_session = 0;
79
80         // reopen same session to check that it opens without error
81         template_session = new Session (*AudioEngine::instance (), new_session_dir, session_name);
82
83         CPPUNIT_ASSERT (template_session);
84
85         delete template_session;
86         stop_and_destroy_backend ();
87 }
88
89 void
90 SessionTest::open_session_utf8_path ()
91 {
92         std::vector<std::string> utf8_strings;
93
94         get_utf8_test_strings (utf8_strings);
95
96         CPPUNIT_ASSERT (!utf8_strings.empty());
97
98         const string test_dir = new_test_output_dir ("open_session_utf8_path");
99
100         for (std::vector<std::string>::const_iterator i = utf8_strings.begin (); i != utf8_strings.end ();
101              ++i) {
102
103                 const string session_name (*i);
104                 std::string new_session_dir = Glib::build_filename (test_dir, session_name);
105                 bool new_session_failed = false;
106
107                 CPPUNIT_ASSERT (!Glib::file_test (new_session_dir, Glib::FILE_TEST_EXISTS));
108
109                 create_and_start_dummy_backend ();
110
111                 ARDOUR::Session* session = 0;
112
113                 try {
114                         session = new Session (*AudioEngine::instance(), new_session_dir, session_name);
115
116                         CPPUNIT_ASSERT (session);
117
118                         session->save_state ("");
119
120                 } catch(...) {
121                         new_session_failed = true;
122
123                         std::cerr << "Failed to create new session using name : " << *i << std::endl;
124                 }
125
126                 delete session;
127                 session = 0;
128                 stop_and_destroy_backend ();
129
130                 CPPUNIT_ASSERT (!new_session_failed);
131
132                 if (new_session_failed) break;
133
134                 create_and_start_dummy_backend ();
135
136                 bool open_session_failed = false;
137
138                 try {
139                         // reopen same session to check that it opens without error
140                         session = new Session (*AudioEngine::instance (), new_session_dir, session_name);
141
142                         CPPUNIT_ASSERT (session);
143                 } catch (...) {
144                         open_session_failed = true;
145
146                         std::cerr << "Failed to open session using name : " << *i << std::endl;
147                 }
148
149                 delete session;
150                 session = 0;
151                 stop_and_destroy_backend ();
152
153                 CPPUNIT_ASSERT (!open_session_failed);
154
155                 if (open_session_failed) break;
156         }
157
158 }