0
|
1 local Luan = require "luan:Luan.luan"
|
|
2 local error = Luan.error
|
|
3 local pairs = Luan.pairs or error()
|
|
4 local String = require "luan:String.luan"
|
|
5 local starts_with = String.starts_with or error()
|
|
6 local Math = require "luan:Math.luan"
|
|
7 local random = Math.random or error()
|
|
8 local Parsers = require "luan:Parsers.luan"
|
|
9 local json_string = Parsers.json_string or error()
|
|
10 local Io = require "luan:Io.luan"
|
|
11 local uri = Io.uri or error()
|
|
12 local output_to = Io.output_to or error()
|
|
13 local Http = require "luan:http/Http.luan"
|
|
14 local Utils = require "site:/lib/Utils.luan"
|
|
15 local list_to_set = Utils.list_to_set or error()
|
|
16 local compressed = Utils.compressed or error()
|
|
17 local Logging = require "luan:logging/Logging.luan"
|
|
18 local logger = Logging.logger "Ab_test"
|
|
19
|
|
20
|
|
21 local Ab_test = {}
|
|
22
|
|
23 Ab_test.tests = {
|
|
24 --[[
|
|
25 dummy = {
|
|
26 values = { "a", "b" }
|
|
27 }
|
|
28 --]]
|
|
29 home = {
|
|
30 values = { "old", "new" }
|
|
31 }
|
|
32 }
|
|
33
|
|
34 local function write(fn)
|
|
35 local request = Http.request
|
|
36 if request.ab_uri == nil then
|
|
37 request.ab_uri = uri("string:")
|
|
38 request.ab_out = request.ab_uri.text_writer()
|
|
39 end
|
|
40 output_to( request.ab_out, fn )
|
|
41 end
|
|
42
|
|
43 local cookie_names = list_to_set{}
|
|
44
|
|
45 do
|
|
46 local function set_cookie(name,value)
|
|
47 Http.response.set_persistent_cookie( name, value )
|
|
48 Http.request.cookies[name] = value
|
|
49 end
|
|
50
|
|
51 for name, info in pairs(Ab_test.tests) do
|
|
52 local cookie_name = "test_"..name
|
|
53 local values = info.values
|
|
54 cookie_names[cookie_name] = true
|
|
55
|
|
56 local value_set = list_to_set(values)
|
|
57
|
|
58 function info.value()
|
|
59 local value = Http.request.cookies[cookie_name]
|
|
60 if not value_set[value] then
|
|
61 value = values[random(#values)]
|
|
62 set_cookie( cookie_name, value )
|
|
63 write( function() %>
|
|
64 setAbTest( <%=json_string(cookie_name)%>, <%=json_string(values,compressed)%> );
|
|
65 <% end )
|
|
66 end
|
|
67 return value
|
|
68 end
|
|
69
|
|
70 function info.has_value()
|
|
71 return Http.request.cookies[cookie_name] ~= nil
|
|
72 end
|
|
73
|
|
74 end_for
|
|
75 end_do
|
|
76
|
|
77 local function remove_tests()
|
|
78 write( function() %>
|
|
79 removeAbTest('test_dummy');
|
|
80 <% end )
|
|
81 end
|
|
82
|
|
83 function Ab_test.head()
|
|
84 for cookie_name in pairs(Http.request.cookies) do
|
|
85 if starts_with(cookie_name,"test_") and not cookie_names[cookie_name] then
|
|
86 Http.response.remove_cookie(cookie_name)
|
|
87 end
|
|
88 end
|
|
89 -- remove_tests()
|
|
90 local request = Http.request
|
|
91 if request.ab_uri ~= nil then
|
|
92 request.ab_out.close()
|
|
93 request.ab_out = nil
|
|
94 %>
|
|
95 <script>
|
|
96 <%= request.ab_uri.read_text() %>
|
|
97 </script>
|
|
98 <%
|
|
99 end
|
|
100 end
|
|
101
|
|
102 return Ab_test
|