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"