Skip to content
This repository was archived by the owner on Jan 27, 2023. It is now read-only.

Commit f811f2a

Browse files
authored
Merge pull request #17 from cipherstash/add-rake-tasks-for-generating-tests
Add rake tasks for generating orderable strings test cases
2 parents 85d0c1e + caf116b commit f811f2a

2 files changed

Lines changed: 102 additions & 0 deletions

File tree

Rakefile

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,18 @@ task :release do
2828
sh "git release"
2929
end
3030

31+
require "./lib/cipherstash/client/ordered_string_test_generator"
32+
33+
desc "Generate test cases for orderise_string to be used by other CipherStash clients"
34+
task :generate_orderise_string_test_cases do
35+
CipherStash::Client::OrderedStringTestGenerator.new.generate_orderise_string_test_cases
36+
end
37+
38+
desc "Generate test cases for string comparison to be used by other CipherStash clients"
39+
task :generate_string_comparison_test_cases do
40+
CipherStash::Client::OrderedStringTestGenerator.new.generate_string_comparison_test_cases
41+
end
42+
3143
require 'yard'
3244

3345
YARD::Rake::YardocTask.new :doc do |yardoc|
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
require "securerandom"
2+
require "json"
3+
4+
require_relative "../index"
5+
6+
module CipherStash
7+
class Client
8+
# Generates test cases for orderable strings that can be used in automated tests in other
9+
# clients (e.g. StashRS). Test cases are written to JSON files.
10+
#
11+
# Example usage in StashRS:
12+
# https://github.com/cipherstash/cipherstash-rs/blob/00ff66d712e6f36a89acfa731b680a69789647cf/packages/cipherstash-client/src/indexer/mapping_indexer.rs#L537-L570
13+
#
14+
# @private
15+
class OrderedStringTestGenerator
16+
# The number of test cases to generate per test file. This number is arbitrary. 100 seems good
17+
# because GitHub is willing to display the output files in diffs in PRs, but will require
18+
# pulling branches down for larger numbers of test cases.
19+
NUM_TEST_CASES = 100
20+
21+
# Max character code for ASCII characters in randomly generated strings in test data.
22+
ASCII_CHAR_CODE_MAX = 127
23+
24+
# The max length of randomly generated strings in test data. This number is also somewhat
25+
# arbitrary. The first 80 ASCII characters are considered for ordering, so we want some
26+
# strings with a length of at least 80. 200 seems good because this will also test lengths
27+
# beyond what actually gets indexed for ordering but doesn't bloat the test files too much.
28+
MAX_STRING_LENGTH = 200
29+
30+
def generate_orderise_string_test_cases
31+
orderise_string_cases = (0..(NUM_TEST_CASES - 1)).map do
32+
str = random_ascii_string
33+
output = index.__send__ :orderise_string, str
34+
{input: str, output: output}
35+
end
36+
37+
puts JSON.pretty_generate(orderise_string_cases)
38+
end
39+
40+
def generate_string_comparison_test_cases
41+
string_comparison_cases = (0..(NUM_TEST_CASES - 1)).map do
42+
str_a = random_ascii_string
43+
terms_a = index.__send__ :orderise_string, str_a
44+
45+
str_b = random_ascii_string
46+
terms_b = index.__send__ :orderise_string, str_b
47+
48+
output = case terms_a <=> terms_b
49+
when -1
50+
"<"
51+
when 0
52+
"=="
53+
when 1
54+
">"
55+
end
56+
57+
{input: [str_a, str_b], output: output}
58+
end
59+
60+
puts JSON.pretty_generate(string_comparison_cases)
61+
end
62+
63+
private
64+
65+
def random_ascii_string
66+
(0..rand(MAX_STRING_LENGTH - 1)).map { rand(ASCII_CHAR_CODE_MAX + 1).chr }.join
67+
end
68+
69+
def index
70+
id = SecureRandom.uuid
71+
settings = {
72+
"meta" => {
73+
"$indexId" => id,
74+
"$indexName" => "titleSort",
75+
"$prfKey" => SecureRandom.hex(16),
76+
"$prpKey" => SecureRandom.hex(16),
77+
},
78+
"mapping" => {
79+
"kind" => "range",
80+
"field" => "title",
81+
"fieldType"=>"string",
82+
}
83+
}
84+
schema_versions = {:first=>0, :last=>0, :searchable=>true}
85+
86+
CipherStash::Index.generate(id, settings, schema_versions)
87+
end
88+
end
89+
end
90+
end

0 commit comments

Comments
 (0)