| #!/usr/bin/env escript |
| %% -*- erlang -*- |
| |
| % Licensed under the Apache License, Version 2.0 (the "License"); you may not |
| % use this file except in compliance with the License. You may obtain a copy of |
| % the License at |
| % |
| % http://www.apache.org/licenses/LICENSE-2.0 |
| % |
| % Unless required by applicable law or agreed to in writing, software |
| % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| % License for the specific language governing permissions and limitations under |
| % the License. |
| |
| default_config() -> |
| test_util:build_file("etc/couchdb/default_dev.ini"). |
| |
| local_config_1() -> |
| test_util:source_file("test/etap/081-config-override.1.ini"). |
| |
| local_config_2() -> |
| test_util:source_file("test/etap/081-config-override.2.ini"). |
| |
| local_config_write() -> |
| test_util:build_file("test/etap/temp.081"). |
| |
| % Run tests and wait for the config gen_server to shutdown. |
| run_tests(IniFiles, Tests) -> |
| {ok, Pid} = couch_config:start_link(IniFiles), |
| erlang:monitor(process, Pid), |
| Tests(), |
| couch_config:stop(), |
| receive |
| {'DOWN', _, _, Pid, _} -> ok; |
| _Other -> etap:diag("OTHER: ~p~n", [_Other]) |
| after |
| 1000 -> throw({timeout_error, config_stop}) |
| end. |
| |
| main(_) -> |
| test_util:init_code_path(), |
| etap:plan(17), |
| |
| case (catch test()) of |
| ok -> |
| etap:end_tests(); |
| Other -> |
| etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), |
| etap:bail(Other) |
| end, |
| ok. |
| |
| test() -> |
| |
| CheckStartStop = fun() -> ok end, |
| run_tests([default_config()], CheckStartStop), |
| |
| CheckDefaults = fun() -> |
| etap:is( |
| couch_config:get("couchdb", "max_dbs_open"), |
| "100", |
| "{couchdb, max_dbs_open} is 100 by defualt." |
| ), |
| |
| etap:is( |
| couch_config:get("httpd","port"), |
| "5984", |
| "{httpd, port} is 5984 by default" |
| ), |
| |
| etap:is( |
| couch_config:get("fizbang", "unicode"), |
| undefined, |
| "{fizbang, unicode} is undefined by default" |
| ) |
| end, |
| |
| run_tests([default_config()], CheckDefaults), |
| |
| |
| % Check that subsequent files override values appropriately |
| |
| CheckOverride = fun() -> |
| etap:is( |
| couch_config:get("couchdb", "max_dbs_open"), |
| "10", |
| "{couchdb, max_dbs_open} was overriden with the value 10" |
| ), |
| |
| etap:is( |
| couch_config:get("httpd", "port"), |
| "4895", |
| "{httpd, port} was overriden with the value 4895" |
| ) |
| end, |
| |
| run_tests([default_config(), local_config_1()], CheckOverride), |
| |
| |
| % Check that overrides can create new sections |
| |
| CheckOverride2 = fun() -> |
| etap:is( |
| couch_config:get("httpd", "port"), |
| "80", |
| "{httpd, port} is overriden with the value 80" |
| ), |
| |
| etap:is( |
| couch_config:get("fizbang", "unicode"), |
| "normalized", |
| "{fizbang, unicode} was created by override INI file" |
| ) |
| end, |
| |
| run_tests([default_config(), local_config_2()], CheckOverride2), |
| |
| |
| % Check that values can be overriden multiple times |
| |
| CheckOverride3 = fun() -> |
| etap:is( |
| couch_config:get("httpd", "port"), |
| "80", |
| "{httpd, port} value was taken from the last specified INI file." |
| ) |
| end, |
| |
| run_tests( |
| [default_config(), local_config_1(), local_config_2()], |
| CheckOverride3 |
| ), |
| |
| % Check persistence to last file. |
| |
| % Empty the file in case it exists. |
| {ok, Fd} = file:open(local_config_write(), write), |
| ok = file:truncate(Fd), |
| ok = file:close(Fd), |
| |
| % Open and write a value |
| CheckCanWrite = fun() -> |
| etap:is( |
| couch_config:get("httpd", "port"), |
| "5984", |
| "{httpd, port} is still 5984 by default" |
| ), |
| |
| etap:is( |
| couch_config:set("httpd", "port", "8080"), |
| ok, |
| "Writing {httpd, port} is kosher." |
| ), |
| |
| etap:is( |
| couch_config:get("httpd", "port"), |
| "8080", |
| "{httpd, port} was updated to 8080 successfully." |
| ), |
| |
| etap:is( |
| couch_config:delete("httpd", "bind_address"), |
| ok, |
| "Deleting {httpd, bind_address} succeeds" |
| ), |
| |
| etap:is( |
| couch_config:get("httpd", "bind_address"), |
| undefined, |
| "{httpd, bind_address} was actually deleted." |
| ) |
| end, |
| |
| run_tests([default_config(), local_config_write()], CheckCanWrite), |
| |
| % Open and check where we don't expect persistence. |
| |
| CheckDidntWrite = fun() -> |
| etap:is( |
| couch_config:get("httpd", "port"), |
| "5984", |
| "{httpd, port} was not persisted to the primary INI file." |
| ), |
| |
| etap:is( |
| couch_config:get("httpd", "bind_address"), |
| "127.0.0.1", |
| "{httpd, bind_address} was not deleted form the primary INI file." |
| ) |
| end, |
| |
| run_tests([default_config()], CheckDidntWrite), |
| |
| % Open and check we have only the persistence we expect. |
| CheckDidWrite = fun() -> |
| etap:is( |
| couch_config:get("httpd", "port"), |
| "8080", |
| "{httpd, port} is still 8080 after reopening the config." |
| ), |
| |
| etap:is( |
| couch_config:get("httpd", "bind_address"), |
| undefined, |
| "{httpd, bind_address} is still \"\" after reopening." |
| ) |
| end, |
| |
| run_tests([local_config_write()], CheckDidWrite), |
| |
| ok. |