#!/usr/bin/env bash
#
# Copyright (c) 2016 Jeromy Johnson
# MIT Licensed; see the LICENSE file in this repository.
#

test_description="Test ipfs repo fsck"

. lib/test-lib.sh

test_init_ipfs

sort_rand() {
  case `uname` in
    Linux|FreeBSD)
      sort -R
      ;;
    Darwin)
      ruby -e 'puts STDIN.readlines.shuffle'
      ;;
    *)
      echo "unsupported system: $(uname)"
  esac
}

check_random_corruption() {
  # Exclude well-known blocks from corruption as they cause test flakiness:
  # - CIQL7TG2PB52XIZLLHDYIUFMHUQLMMZWBNBZSLDXFCPZ5VDNQQ2WDZQ.data: empty file block
  # - CIQFTFEEHEDF6KLBT32BFAGLXEZL4UWFNWM4LFTLMXQBCERZ6CMLX3Y.data: empty directory block (has special handling, served from memory even when corrupted on disk)
  to_break=$(find "$IPFS_PATH/blocks" -type f -name '*.data' | grep -v -E "CIQL7TG2PB52XIZLLHDYIUFMHUQLMMZWBNBZSLDXFCPZ5VDNQQ2WDZQ.data|CIQFTFEEHEDF6KLBT32BFAGLXEZL4UWFNWM4LFTLMXQBCERZ6CMLX3Y.data" | sort_rand | head -n 1)

  test_expect_success "back up file and overwrite it" '
    cp "$to_break" backup_file &&
    echo "this is super broken" > "$to_break"
  '

  test_expect_success "repo verify detects failure" '
    test_expect_code 1 ipfs repo verify
  '

  test_expect_success "replace the object" '
    cp backup_file "$to_break"
  '

  test_expect_success "ipfs repo verify passes just fine now" '
    ipfs repo verify
  '
}

test_expect_success "create some files" '
  random-files -depth=3 -dirs=4 -files=10 foobar > /dev/null
'

test_expect_success "add them all" '
  ipfs add -r -q foobar > /dev/null
'

for i in `seq 20`
do
  check_random_corruption
done

test_done
