| #! /usr/bin/env escript |
| % 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. |
| |
| -define(WITH_LRU(F), tutil:with_lru(fun(LRU) -> F(LRU) end)). |
| |
| main([]) -> |
| code:add_pathz("test"), |
| code:add_pathz("ebin"), |
| |
| tutil:run(16, fun() -> test() end). |
| |
| |
| test() -> |
| test_lifecycle(), |
| test_table_names(), |
| ?WITH_LRU(test_insert_lookup), |
| ?WITH_LRU(test_insert_overwrite), |
| ?WITH_LRU(test_insert_remove), |
| ?WITH_LRU(test_clear), |
| |
| ok. |
| |
| |
| test_lifecycle() -> |
| Resp = ets_lru:start_link(?MODULE, []), |
| etap:fun_is( |
| fun({ok, LRU}) when is_pid(LRU) -> true; (_) -> false end, |
| Resp, |
| "ets_lru:start_link/2 returned an LRU" |
| ), |
| {ok, LRU} = Resp, |
| etap:is(ok, ets_lru:stop(LRU), "Destroyed the LRU ok"). |
| |
| |
| test_table_names() -> |
| {ok, LRU} = ets_lru:start_link(foo, []), |
| Exists = fun(Name) -> ets:info(Name, size) == 0 end, |
| NExists = fun(Name) -> ets:info(Name, size) == undefined end, |
| etap:is(Exists(foo_objects), true, "foo_objects exists"), |
| etap:is(Exists(foo_atimes), true, "foo_atimes exists"), |
| etap:is(Exists(foo_ctimes), true, "foo_ctimes exists"), |
| |
| Ref = erlang:monitor(process, LRU), |
| ets_lru:stop(LRU), |
| |
| receive {'DOWN', Ref, process, LRU, Reason} -> ok end, |
| etap:is(Reason, normal, "LRU stopped normally"), |
| |
| etap:is(NExists(foo_objects), true, "foo_objects doesn't exist"), |
| etap:is(NExists(foo_atimes), true, "foo_atimes doesn't exist"), |
| etap:is(NExists(foo_ctimes), true, "foo_ctimes doesn't exist"), |
| |
| ok. |
| |
| |
| test_insert_lookup(LRU) -> |
| ok = ets_lru:insert(LRU, foo, bar), |
| Resp = ets_lru:lookup(LRU, foo), |
| etap:is(Resp, {ok, bar}, "Lookup returned the inserted value"). |
| |
| |
| test_insert_lookup_d(LRU) -> |
| ok = ets_lru:insert(LRU, foo, bar), |
| Resp = ets_lru:lookup_d(test_lru, foo), |
| etap:is(Resp, {ok, bar}, "Dirty lookup returned the inserted value"). |
| |
| |
| test_insert_overwrite(LRU) -> |
| ok = ets_lru:insert(LRU, foo, bar), |
| Resp1 = ets_lru:lookup(LRU, foo), |
| etap:is(Resp1, {ok, bar}, "Lookup returned the inserted value"), |
| ok = ets_lru:insert(LRU, foo, bam), |
| Resp2 = ets_lru:lookup(LRU, foo), |
| etap:is(Resp2, {ok, bam}, "Lookup returned the newly inserted value"). |
| |
| |
| test_insert_remove(LRU) -> |
| ok = ets_lru:insert(LRU, foo, bar), |
| Resp1 = ets_lru:lookup(LRU, foo), |
| etap:is(Resp1, {ok, bar}, "Lookup returned the inserted value"), |
| ok = ets_lru:remove(LRU, foo), |
| Resp2 = ets_lru:lookup(LRU, foo), |
| etap:is(Resp2, not_found, "Lookup returned not_found for removed value"). |
| |
| |
| test_clear(LRU) -> |
| ok = ets_lru:insert(LRU, foo, bar), |
| Resp1 = ets_lru:lookup(LRU, foo), |
| etap:is(Resp1, {ok, bar}, "Lookup returned the inserted value"), |
| ok = ets_lru:clear(LRU), |
| Resp2 = ets_lru:lookup(LRU, foo), |
| etap:is(Resp2, not_found, "Lookup returned not_found after a clear"). |