anchor.diff:                          {100, mb(3)}, UserConfig),
       range_get_test_case(?TEST_BUCKET, ?KEY_MULTIPLE_BLOCK, MultipleBlock,
                           {0, none}, UserConfig),
  -    pass.
  +    ok.
  +
  +mp_get_cases(UserConfig) ->
  +    TinyContent = multipart_upload(?TEST_BUCKET, ?KEY_MP_TINY,
  +                                   [400], UserConfig),
  +    SmallContent = multipart_upload(?TEST_BUCKET, ?KEY_MP_SMALL,
  +                                    [mb(3)], UserConfig),
  +    LargeContent = multipart_upload(?TEST_BUCKET, ?KEY_MP_LARGE,
  +                                    [mb(10), mb(5), mb(9) + 123, mb(6), mb(400)], % 30MB + 523 B
  +                                    UserConfig),
  +
  +    %% Range GET for single part / single block
  +    [range_get_test_case(?TEST_BUCKET, ?KEY_MP_TINY, TinyContent,
  +                         Range, UserConfig)
  +     || Range <- [{10, 20},
  +                  {0, none}, {none, 10},
  +                  {0, 0}, {0, 99}, {0, 1000000}]],
  +
  +    %% Range GET for single part / multiple blocks
  +    [range_get_test_case(?TEST_BUCKET, ?KEY_MP_SMALL, SmallContent,
  +                         {Start, End}, UserConfig)
  +     || Start <- [100, mb(1)+100],
  +        End   <- [mb(1)+100, mb(3)-1, mb(4)]],
  +
  +    %% Range GET for multiple parts / multiple blocks
  +    [range_get_test_case(?TEST_BUCKET, ?KEY_MP_LARGE, LargeContent,
  +                         {Start, End}, UserConfig)
  +     || Start <- [mb(1), mb(16)],
  +        End   <- [mb(16), mb(30), mb(30) + 500, mb(1000)]],
  +    ok.
   
   mb(MegaBytes) ->
       MegaBytes * 1024 * 1024.
  
positive.code: -export([confirm/0]).
  -include_lib("eunit/include/eunit.hrl").
  
  -define(TEST_BUCKET,        "riak_test_bucket").
  -define(KEY_SINGLE_BLOCK,   "riak_test_key1").
  -define(KEY_MULTIPLE_BLOCK, "riak_test_key2").
  
  confirm() ->
      {RiakNodes, _CSNodes, _Stanchion} = rtcs:setup(4),
  
negative.code:         _ ->
              mochiweb_http:range_skip_length(Spec, Size)
      end.
  
  multipart_upload(Bucket, Key, Sizes, Config) ->
      InitRes = erlcloud_s3_multipart:initiate_upload(
                  Bucket, Key, "text/plain", [], Config),
      UploadId = erlcloud_xml:get_text(
                   "/InitiateMultipartUploadResult/UploadId", InitRes),
      Content = upload_parts(Bucket, Key, UploadId, Config, 1, Sizes, [], []),
      basic_get_test_case(Bucket, Key, Content, Config),
      Content.
  
  upload_parts(Bucket, Key, UploadId, Config, _PartCount, [], Contents, Parts) ->
      ?assertEqual(ok, erlcloud_s3_multipart:complete_upload(
                         Bucket, Key, UploadId, lists:reverse(Parts), Config)),
      iolist_to_binary(lists:reverse(Contents));
  upload_parts(Bucket, Key, UploadId, Config, PartCount, [Size | Sizes], Contents, Parts) ->
      Content = crypto:rand_bytes(Size),
      {RespHeaders, _UploadRes} = erlcloud_s3_multipart:upload_part(
                                    Bucket, Key, UploadId, PartCount, Content, Config),
      PartEtag = proplists:get_value("etag", RespHeaders),
      lager:debug("UploadId: ~p~n", [UploadId]),
      lager:debug("PartEtag: ~p~n", [PartEtag]),
      upload_parts(Bucket, Key, UploadId, Config, PartCount + 1,
                   Sizes, [Content | Contents], [{PartCount, PartEtag} | Parts]).
  