xref: /aosp_15_r20/external/rappor/tests/user_spec.py (revision 2abb31345f6c95944768b5222a9a5ed3fc68cc00)
1*2abb3134SXin Li#!/usr/bin/python
2*2abb3134SXin Li"""Print a test spec on stdout.
3*2abb3134SXin Li
4*2abb3134SXin LiEach line has parmaeters for a test case.  The regtest.sh shell script reads
5*2abb3134SXin Lithese lines and runs parallel processes.
6*2abb3134SXin Li
7*2abb3134SXin LiWe use Python data structures so the test cases are easier to read and edit.
8*2abb3134SXin Li"""
9*2abb3134SXin Li
10*2abb3134SXin Liimport sys
11*2abb3134SXin Li
12*2abb3134SXin Li#
13*2abb3134SXin Li# TEST CONFIGURATION
14*2abb3134SXin Li#
15*2abb3134SXin Li
16*2abb3134SXin Li# For gen_sim_input.py
17*2abb3134SXin LiINPUT_PARAMS = {
18*2abb3134SXin Li    # distribution, num unique values, num clients, values per client
19*2abb3134SXin Li    'exp-100k': ('exp', 100, 100000, 1),
20*2abb3134SXin Li    'exp-1m': ('exp', 100, 1000000, 1),
21*2abb3134SXin Li}
22*2abb3134SXin Li
23*2abb3134SXin Li# For rappor_sim.py
24*2abb3134SXin Li# 'k, h, m, p, q, f' as in params file.
25*2abb3134SXin LiRAPPOR_PARAMS = {
26*2abb3134SXin Li    # Initial chrome params from 2014.
27*2abb3134SXin Li    # NOTE: fastrand simulation only supports 64 bits!  Make sure to use the
28*2abb3134SXin Li    # 'fast_counts' code path.
29*2abb3134SXin Li    'chrome128': (128, 2, 128, 0.25, 0.75, 0.50),
30*2abb3134SXin Li
31*2abb3134SXin Li    # Chrome params from early 2015 -- changed to 8 bit reports.
32*2abb3134SXin Li    'chrome8': (8, 2, 128, 0.25, 0.75, 0.50),
33*2abb3134SXin Li
34*2abb3134SXin Li    # Original demo params
35*2abb3134SXin Li    'demo': (16, 2, 64, 0.5, 0.75, 0.5),
36*2abb3134SXin Li}
37*2abb3134SXin Li
38*2abb3134SXin Li# For deriving candidates from true inputs.
39*2abb3134SXin LiMAP_PARAMS = {
40*2abb3134SXin Li    # 1. Number of extra candidates to add.
41*2abb3134SXin Li    # 2. Candidate strings to remove from the map.  This FORCES false
42*2abb3134SXin Li    # negatives, e.g. for common strings, since a string has to be in the map
43*2abb3134SXin Li    # for RAPPOR to choose it.
44*2abb3134SXin Li    'add-100': (100, []),
45*2abb3134SXin Li    'add-1000': (1000, []),
46*2abb3134SXin Li    'add-2000': (2000, []),
47*2abb3134SXin Li    # also thrashes on 128 bits
48*2abb3134SXin Li    'add-3000': (3000, []),
49*2abb3134SXin Li    'add-10000': (10000, []),
50*2abb3134SXin Li    'add-15000': (15000, []),  # approx number of candidates for eTLD+1
51*2abb3134SXin Li    'add-100000': (100000, []),
52*2abb3134SXin Li    'remove-top-2': (20, ['v1', 'v2']),
53*2abb3134SXin Li}
54*2abb3134SXin Li
55*2abb3134SXin Li# test case name -> (input params name, RAPPOR params name, map params name)
56*2abb3134SXin LiTEST_CASES = [
57*2abb3134SXin Li    ('chrome128-100k-100', 'exp-100k', 'chrome128', 'add-100'),
58*2abb3134SXin Li    ('chrome128-100k-1000', 'exp-100k', 'chrome128', 'add-1000'),
59*2abb3134SXin Li    ('chrome128-100k-2000', 'exp-100k', 'chrome128', 'add-2000'),
60*2abb3134SXin Li    ('chrome128-100k-3000', 'exp-100k', 'chrome128', 'add-3000'),
61*2abb3134SXin Li    # 128 bits and 15k candidates fails on a machine with 8 GB memory.
62*2abb3134SXin Li    # Lasso finishes with 7508 non-zero coefficients, and then allocation
63*2abb3134SXin Li    # fails.  TODO: just take the highest ones?
64*2abb3134SXin Li    #('chrome128-100k-15000', 'exp-100k', 'chrome128', 'add-15000'),
65*2abb3134SXin Li    #('chrome128-100k-100000', 'exp-100k', 'chrome128', 'add-100000'),
66*2abb3134SXin Li
67*2abb3134SXin Li    # NOTE: Adding more candidates exercises LASSO
68*2abb3134SXin Li    ('chrome8-100k-100', 'exp-100k', 'chrome8', 'add-100'),
69*2abb3134SXin Li    ('chrome8-100k-1000', 'exp-100k', 'chrome8', 'add-1000'),
70*2abb3134SXin Li    ('chrome8-100k-2000', 'exp-100k', 'chrome8', 'add-2000'),
71*2abb3134SXin Li    ('chrome8-100k-3000', 'exp-100k', 'chrome8', 'add-3000'),
72*2abb3134SXin Li    ('chrome8-100k-15000', 'exp-100k', 'chrome8', 'add-15000'),
73*2abb3134SXin Li
74*2abb3134SXin Li    # NOTE: This one takes too much memory!  More than 4 GB.  This is because
75*2abb3134SXin Li    # Lasso gets a huge matrix (100,000).  We got 1564 non-zero coefficients.
76*2abb3134SXin Li    ('chrome8-100k-100000', 'exp-100k', 'chrome8', 'add-100000'),
77*2abb3134SXin Li
78*2abb3134SXin Li    # What happens when the the candidates are missing top values?
79*2abb3134SXin Li    ('chrome8-badcand', 'exp-100k', 'chrome8', 'remove-top-2'),
80*2abb3134SXin Li
81*2abb3134SXin Li    # TODO: Use chrome params with real map from Alexa 1M ?
82*2abb3134SXin Li]
83*2abb3134SXin Li
84*2abb3134SXin Li#
85*2abb3134SXin Li# END TEST CONFIGURATION
86*2abb3134SXin Li#
87*2abb3134SXin Li
88*2abb3134SXin Li
89*2abb3134SXin Lidef main(argv):
90*2abb3134SXin Li  rows = []
91*2abb3134SXin Li  for test_case, input_name, rappor_name, map_name in TEST_CASES:
92*2abb3134SXin Li    input_params = INPUT_PARAMS[input_name]
93*2abb3134SXin Li    rappor_params = RAPPOR_PARAMS[rappor_name]
94*2abb3134SXin Li    map_params = MAP_PARAMS[map_name]
95*2abb3134SXin Li    row = tuple([test_case]) + input_params + rappor_params + map_params
96*2abb3134SXin Li    rows.append(row)
97*2abb3134SXin Li
98*2abb3134SXin Li  for row in rows:
99*2abb3134SXin Li    for cell in row:
100*2abb3134SXin Li      if isinstance(cell, list):
101*2abb3134SXin Li        if cell:
102*2abb3134SXin Li          cell_str = '|'.join(cell)
103*2abb3134SXin Li        else:
104*2abb3134SXin Li          cell_str = 'NONE'  # we don't want an empty string
105*2abb3134SXin Li      else:
106*2abb3134SXin Li        cell_str = cell
107*2abb3134SXin Li      print cell_str,  # print it with a space after it
108*2abb3134SXin Li    print  # new line after row
109*2abb3134SXin Li
110*2abb3134SXin Li
111*2abb3134SXin Liif __name__ == '__main__':
112*2abb3134SXin Li  try:
113*2abb3134SXin Li    main(sys.argv)
114*2abb3134SXin Li  except RuntimeError, e:
115*2abb3134SXin Li    print >>sys.stderr, 'FATAL: %s' % e
116*2abb3134SXin Li    sys.exit(1)
117