github.com/cozy/cozy-stack@v0.0.0-20240603063001-31110fa4cae1/tests/system/scalability/random.rb (about) 1 require_relative './base_tests.rb' 2 3 # This test creates random sharing scenarios 4 5 N_SHARINGS = 10 6 MAX_RECIPIENTS = 10 7 MAX_FILES_INIT = 100 8 MAX_UPDATES = 1000 # Includes CUD operations 9 FILE_MAX_SIZE = 1000 # In KB 10 11 # Create the instances 12 names = Array.new(MAX_RECIPIENTS + 1) { Faker::Internet.domain_word } 13 insts = create_instances names 14 inst_a = insts[0] 15 recipients = insts.drop 1 16 17 sids = Array.new(N_SHARINGS) 18 folders_a = Array.new(N_SHARINGS) 19 members = {} 20 dirs = {} 21 files = {} 22 23 N_SHARINGS.times do |i| 24 # Create the hierarchy to share 25 folders_a[i] = Folder.create inst_a, name: Faker::Internet.unique.slug 26 n_files = Random.rand 1..MAX_FILES_INIT 27 dirs_a, files_a = create_hierarchy inst_a, folders_a[i], n_files, FILE_MAX_SIZE 28 29 # Randomly select the recipients 30 n_rec = Random.rand 1..MAX_RECIPIENTS 31 recs = recipients.sample(n_rec) 32 s_members = [inst_a] + recs 33 34 # Share it 35 sharing = create_sharing s_members, folders_a[i] 36 sid = sharing.couch_id 37 sids[i] = sid 38 dirs[sid] = { inst_a.name => dirs_a } 39 files[sid] = { inst_a.name => files_a } 40 members[sid] = s_members 41 42 # Check everything went well for each recipient of this sharing 43 da = File.join Helpers.current_dir, inst_a.domain, folders_a[i].name 44 path_folder = "/#{Helpers::SHARED_WITH_ME}/#{folders_a[i].name}" 45 46 recs.each do |rec| 47 drec = File.join Helpers.current_dir, rec.domain, path_folder 48 poll_for_diff da, drec 49 folder_rec = Folder.find_by_path rec, path_folder 50 dirs[sid][rec.name], files[sid][rec.name] = get_hierarchy rec, folder_rec 51 end 52 end 53 54 puts "#{N_SHARINGS} sharings have been successfully created" 55 56 # Generate random writes on random sharings on random instances 57 n_updates = Random.rand MAX_UPDATES 58 59 n_updates.times do 60 sid = pick_random_element sids 61 inst = pick_random_element members[sid] 62 dirs_inst = dirs[sid][inst.name] 63 files_inst = files[sid][inst.name] 64 65 case Random.rand(3) 66 # Insert 67 when 0 68 create_dir_or_file inst, dirs_inst, files_inst 69 # Update 70 when 1 71 update_dir_or_file inst, dirs, files 72 # Delete 73 when 2 74 remove_folder_or_file inst, dirs_inst, files_inst 75 end 76 end 77 78 start = Time.now 79 sids.each_with_index do |sid, i| 80 da = File.join Helpers.current_dir, inst_a.domain, folders_a[i].name 81 path_folder = "/#{Helpers::SHARED_WITH_ME}/#{folders_a[i].name}" 82 recs = members[sid].drop 1 83 recs.each do |rec| 84 drec = File.join Helpers.current_dir, rec.domain, path_folder 85 poll_for_diff da, drec 86 end 87 end 88 finish = Time.now 89 diff = finish - start 90 puts "All sharings have converged in #{diff}s after #{n_updates} updates"