// -*- mode: c++; c-basic-offset:4 -*- // This file is part of libdap, A C++ implementation of the OPeNDAP Data // Access Protocol. // Copyright (c) 2003 OPeNDAP, Inc. // Author: James Gallagher // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library 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 // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // You can contact OPeNDAP, Inc. at PO Box 112, Saunderstown, RI. 02874-0112. // Tests for the AISMerge class. #include #include #include //#define DODS_DEBUG #include "Connect.h" #include "AISMerge.h" #include "debug.h" #include #include "testFile.h" using namespace CppUnit; namespace libdap { class AISMergeTest:public TestFixture { private: AISMerge * ais_merge; static string fnoc1, fnoc2, fnoc3, bears, coads, three_fnoc; static string fnoc1_ais, fnoc2_ais, digit_ais, fnoc3_das; static string fnoc1_ais_string, bears_1_ais_string, coads_ais_string; static string fnoc1_merge_ais, fnoc2_merge_ais, fnoc3_merge_ais; static string three_fnoc_merge_ais, starts_with_number_ais_string; string dump2string(FILE * res) { string stuff = ""; char line[256]; while (!feof(res) && !ferror(res) && fgets(&line[0], 256, res) != 0) stuff += line; return stuff; } public: AISMergeTest() { } ~AISMergeTest() { } void setUp() { ais_merge = new AISMerge("ais_testsuite/ais_database.xml"); } void tearDown() { delete ais_merge; ais_merge = 0; } CPPUNIT_TEST_SUITE(AISMergeTest); CPPUNIT_TEST(get_ais_resource_test); CPPUNIT_TEST(merge_test); CPPUNIT_TEST_SUITE_END(); void get_ais_resource_test() { try { ResourceVector rv = ais_merge->d_ais_db.get_resource(fnoc1); Response *res = ais_merge->get_ais_resource(rv[0].get_url()); string stuff = dump2string(res->get_stream()); DBG(cerr << "AIS Resource: " << stuff << endl); CPPUNIT_ASSERT(stuff.find(fnoc1_ais_string) != string::npos); rv = ais_merge->d_ais_db.get_resource(coads); res = ais_merge->get_ais_resource(rv[0].get_url()); CPPUNIT_ASSERT(dump2string(res->get_stream()). find(coads_ais_string) != string::npos); rv = ais_merge->d_ais_db.get_resource(three_fnoc); res = ais_merge->get_ais_resource(rv[0].get_url()); CPPUNIT_ASSERT(dump2string(res->get_stream()). find(starts_with_number_ais_string) != string::npos); } catch(Error & e) { cerr << "Error: " << e.get_error_message() << endl; // If the exception is Not Found then this is not an error; there // are many reasons why the resource might not be found... if (e.get_error_message().find("Not Found:") == string::npos) CPPUNIT_ASSERT(!"Error"); } } void merge_test() { try { Connect *conn; DAS das; string sof; conn = new Connect(fnoc1); // test overwrite (default) conn->request_das(das); ais_merge->merge(fnoc1, das); FILE2string(sof, of, das.print(of)); DBG(cerr << "Merged fnoc1 DAS: " << sof << endl); CPPUNIT_ASSERT(sof.find(fnoc1_merge_ais) != string::npos); delete conn; conn = 0; das.erase(); conn = new Connect(fnoc2); // test replace conn->request_das(das); ais_merge->merge(fnoc2, das); FILE2string(sof, of, das.print(of)); CPPUNIT_ASSERT(sof.find(fnoc2_merge_ais) != string::npos); delete conn; conn = 0; das.erase(); conn = new Connect(fnoc3); // test fallback conn->request_das(das); // with a non-empty das, nothing happens ais_merge->merge(fnoc3, das); FILE2string(sof, of, das.print(of)); CPPUNIT_ASSERT(sof.find(fnoc3_das) != string::npos); das.erase(); // empty das, should add attributes ais_merge->merge(fnoc3, das); FILE2string(sof, of, das.print(of)); CPPUNIT_ASSERT(sof.find(fnoc3_merge_ais) != string::npos); conn = new Connect(three_fnoc); // test regexp conn->request_das(das); // with a non-empty das, nothing happens ais_merge->merge(three_fnoc, das); FILE2string(sof, of, das.print(of)); CPPUNIT_ASSERT(sof.find(three_fnoc_merge_ais) != string::npos); } catch(Error & e) { cerr << "Error: " << e.get_error_message() << endl; if (e.get_error_message().find("Not Found:") == string::npos) CPPUNIT_ASSERT(!"Error"); } } }; string AISMergeTest::fnoc1 = "http://test.opendap.org/opendap/data/nc/fnoc1.nc"; string AISMergeTest::fnoc2 = "http://test.opendap.org/opendap/data/nc/fnoc2.nc"; string AISMergeTest::fnoc3 = "http://test.opendap.org/opendap/data/nc/fnoc3.nc"; string AISMergeTest::bears = "http://test.opendap.org/opendap/data/nc/bears.nc"; string AISMergeTest::coads = "http://test.opendap.org/opendap/data/nc/coads_climatology.nc"; string AISMergeTest::three_fnoc = "http://test.opendap.org/opendap/data/nc/3fnoc.nc"; string AISMergeTest::fnoc1_ais = "http://test.opendap.org/ais/fnoc1.nc.das"; string AISMergeTest::fnoc2_ais = "http://test.opendap.org/ais/fnoc2.nc.das"; string AISMergeTest::digit_ais = (string)TEST_SRC_DIR + "/ais_testsuite/starts_with_number.das"; string AISMergeTest::fnoc1_ais_string = "Attributes {\n\ u {\n\ String DODS_Name \"UWind\";\n\ }\n\ v {\n\ String DODS_Name \"VWind\";\n\ }\n\ }"; string AISMergeTest::bears_1_ais_string = "Attributes {\n\ bears {\n\ String longname \"Test data\";\n\ }\n\ }"; string AISMergeTest::coads_ais_string = "Attributes {\n\ COADSX {\n\ String long_name \"Longitude\";\n\ }\n\ }"; string AISMergeTest::starts_with_number_ais_string = "Attributes {\n\ NC_GLOBAL {\n\ String AIS_Test_info \"This dataset's name starts with a digit.\";\n\ }\n\ }"; string AISMergeTest::fnoc3_das = "Attributes {\n\ u {\n\ String units \"meter per second\";\n\ String long_name \"Vector wind eastward component\";\n\ String missing_value \"-32767\";\n\ String scale_factor \"0.005\";\n\ }\n\ v {\n\ String units \"meter per second\";\n\ String long_name \"Vector wind northward component\";\n\ String missing_value \"-32767\";\n\ String scale_factor \"0.005\";\n\ }\n\ lat {\n\ String units \"degree North\";\n\ }\n\ lon {\n\ String units \"degree East\";\n\ }\n\ time {\n\ String units \"hours from base_time\";\n\ }\n\ NC_GLOBAL {\n\ String base_time \"88-245-00:00:00\";\n\ String title \" FNOC UV wind components from 1988-245 to 1988-247.\";\n\ }\n\ DODS_EXTRA {\n\ String Unlimited_Dimension \"time_a\";\n\ }\n\ }"; string AISMergeTest::fnoc1_merge_ais = "Attributes {\n\ u {\n\ String units \"meter per second\";\n\ String long_name \"Vector wind eastward component\";\n\ String missing_value \"-32767\";\n\ String scale_factor \"0.005\";\n\ String DODS_Name \"UWind\", \"UWind\";\n\ Byte b 128;\n\ Int32 i 32000;\n\ Url WOA01 \"http://localhost/junk\";\n\ }\n\ v {\n\ String units \"meter per second\";\n\ String long_name \"Vector wind northward component\";\n\ String missing_value \"-32767\";\n\ String scale_factor \"0.005\";\n\ String DODS_Name \"VWind\", \"VWind\";\n\ }\n\ lat {\n\ String units \"degree North\";\n\ }\n\ lon {\n\ String units \"degree East\";\n\ }\n\ time {\n\ String units \"hours from base_time\";\n\ }\n\ NC_GLOBAL {\n\ String base_time \"88- 10-00:00:00\";\n\ String title \" FNOC UV wind components from 1988- 10 to 1988- 13.\";\n\ }\n\ DODS_EXTRA {\n\ String Unlimited_Dimension \"time_a\";\n\ }\n\ }"; string AISMergeTest::fnoc2_merge_ais = "Attributes {\n\ u {\n\ String units \"meter per second\";\n\ String long_name \"UWind\";\n\ }\n\ v {\n\ String units \"meter per second\";\n\ String long_name \"VWind\";\n\ }\n\ lat {\n\ String units \"degree North\";\n\ String long_name \"Latitude\";\n\ }\n\ lon {\n\ String units \"degree East\";\n\ String long_name \"Longitude\";\n\ }\n\ time {\n\ }\n\ NC_GLOBAL {\n\ }\n\ DODS_EXTRA {\n\ }\n\ }"; string AISMergeTest::fnoc3_merge_ais = "Attributes {\n\ u {\n\ String long_name \"UWind\";\n\ }\n\ v {\n\ String long_name \"VWind\";\n\ }\n\ lat {\n\ String long_name \"Latitude\";\n\ }\n\ lon {\n\ String long_name \"Longitude\";\n\ }\n\ }"; string AISMergeTest::three_fnoc_merge_ais = "Attributes {\n\ u {\n\ String long_name \"UWind\", \"Vector wind eastward component\";\n\ String units \"meter per second\";\n\ String missing_value \"-32767\";\n\ String scale_factor \"0.005\";\n\ }\n\ v {\n\ String long_name \"VWind\", \"Vector wind northward component\";\n\ String units \"meter per second\";\n\ String missing_value \"-32767\";\n\ String scale_factor \"0.005\";\n\ }\n\ lat {\n\ String long_name \"Latitude\";\n\ String units \"degree North\";\n\ }\n\ lon {\n\ String long_name \"Longitude\";\n\ String units \"degree East\";\n\ }\n\ time {\n\ String units \"hours from base_time\";\n\ }\n\ NC_GLOBAL {\n\ String base_time \"88-245-00:00:00\";\n\ String title \" FNOC UV wind components from 1988-245 to 1988-247.\";\n\ String AIS_Test_info \"This dataset's name starts with a digit.\";\n\ }\n\ DODS_EXTRA {\n\ String Unlimited_Dimension \"time_a\";\n\ }\n\ }"; CPPUNIT_TEST_SUITE_REGISTRATION(AISMergeTest); } // namespace libdap int main(int, char **) { CppUnit::TextTestRunner runner; runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); bool wasSuccessful = runner.run("", false); return wasSuccessful ? 0 : 1; }