| #!/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. |
| |
| main(_) -> |
| test_util:init_code_path(), |
| etap:plan(16), |
| case (catch test()) of |
| ok -> |
| etap:end_tests(); |
| Other -> |
| etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), |
| etap:bail(Other) |
| end, |
| ok. |
| |
| check_status(Pid,ListPropLists) -> |
| From = list_to_binary(pid_to_list(Pid)), |
| Element = lists:foldl( |
| fun(PropList,Acc) -> |
| case couch_util:get_value(pid,PropList) of |
| From -> |
| [PropList | Acc]; |
| _ -> |
| [] |
| end |
| end, |
| [], ListPropLists |
| ), |
| couch_util:get_value(status,hd(Element)). |
| |
| loop() -> |
| receive |
| {add, From} -> |
| Resp = couch_task_status:add_task("type", "task", "init"), |
| From ! {ok, self(), Resp}, |
| loop(); |
| {update, Status, From} -> |
| Resp = couch_task_status:update(Status), |
| From ! {ok, self(), Resp}, |
| loop(); |
| {update_frequency, Msecs, From} -> |
| Resp = couch_task_status:set_update_frequency(Msecs), |
| From ! {ok, self(), Resp}, |
| loop(); |
| {done, From} -> |
| From ! {ok, self(), ok} |
| end. |
| |
| call(Pid, Command) -> |
| Pid ! {Command, self()}, |
| wait(Pid). |
| |
| call(Pid, Command, Arg) -> |
| Pid ! {Command, Arg, self()}, |
| wait(Pid). |
| |
| wait(Pid) -> |
| receive |
| {ok, Pid, Msg} -> Msg |
| after 1000 -> |
| throw(timeout_error) |
| end. |
| |
| test() -> |
| {ok, TaskStatusPid} = couch_task_status:start_link(), |
| |
| TaskUpdater = fun() -> loop() end, |
| % create three updaters |
| Pid1 = spawn(TaskUpdater), |
| Pid2 = spawn(TaskUpdater), |
| Pid3 = spawn(TaskUpdater), |
| |
| ok = call(Pid1, add), |
| etap:is( |
| length(couch_task_status:all()), |
| 1, |
| "Started a task" |
| ), |
| |
| etap:is( |
| call(Pid1, add), |
| {add_task_error, already_registered}, |
| "Unable to register multiple tasks for a single Pid." |
| ), |
| |
| etap:is( |
| check_status(Pid1, couch_task_status:all()), |
| <<"init">>, |
| "Task status was set to 'init'." |
| ), |
| |
| call(Pid1,update,"running"), |
| etap:is( |
| check_status(Pid1,couch_task_status:all()), |
| <<"running">>, |
| "Status updated to 'running'." |
| ), |
| |
| |
| call(Pid2,add), |
| etap:is( |
| length(couch_task_status:all()), |
| 2, |
| "Started a second task." |
| ), |
| |
| etap:is( |
| check_status(Pid2, couch_task_status:all()), |
| <<"init">>, |
| "Second tasks's status was set to 'init'." |
| ), |
| |
| call(Pid2, update, "running"), |
| etap:is( |
| check_status(Pid2, couch_task_status:all()), |
| <<"running">>, |
| "Second task's status updated to 'running'." |
| ), |
| |
| |
| call(Pid3, add), |
| etap:is( |
| length(couch_task_status:all()), |
| 3, |
| "Registered a third task." |
| ), |
| |
| etap:is( |
| check_status(Pid3, couch_task_status:all()), |
| <<"init">>, |
| "Third tasks's status was set to 'init'." |
| ), |
| |
| call(Pid3, update, "running"), |
| etap:is( |
| check_status(Pid3, couch_task_status:all()), |
| <<"running">>, |
| "Third task's status updated to 'running'." |
| ), |
| |
| |
| call(Pid3, update_frequency, 500), |
| call(Pid3, update, "still running"), |
| etap:is( |
| check_status(Pid3, couch_task_status:all()), |
| <<"still running">>, |
| "Third task's status updated to 'still running'." |
| ), |
| |
| call(Pid3, update, "skip this update"), |
| etap:is( |
| check_status(Pid3, couch_task_status:all()), |
| <<"still running">>, |
| "Status update dropped because of frequency limit." |
| ), |
| |
| call(Pid3, update_frequency, 0), |
| call(Pid3, update, "don't skip"), |
| etap:is( |
| check_status(Pid3, couch_task_status:all()), |
| <<"don't skip">>, |
| "Status updated after reseting frequency limit." |
| ), |
| |
| |
| call(Pid1, done), |
| etap:is( |
| length(couch_task_status:all()), |
| 2, |
| "First task finished." |
| ), |
| |
| call(Pid2, done), |
| etap:is( |
| length(couch_task_status:all()), |
| 1, |
| "Second task finished." |
| ), |
| |
| call(Pid3, done), |
| etap:is( |
| length(couch_task_status:all()), |
| 0, |
| "Third task finished." |
| ), |
| |
| erlang:monitor(process, TaskStatusPid), |
| couch_task_status:stop(), |
| receive |
| {'DOWN', _, _, TaskStatusPid, _} -> |
| ok |
| after |
| 1000 -> |
| throw(timeout_error) |
| end, |
| |
| ok. |