1
1

PreconditionTests.cs 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618
  1. using Microsoft.Net.Http.Headers;
  2. using System.Net;
  3. using System.Net.Http;
  4. using System.Threading.Tasks;
  5. using Xunit;
  6. namespace Masuit.Tools.Core.Test.AspNetCore
  7. {
  8. public class PreconditionTests : TestBase
  9. {
  10. /// <summary>
  11. /// The precondition if match fail test.
  12. /// </summary>
  13. [Fact]
  14. public async Task PreconditionIfMatchFailTest()
  15. {
  16. // Arrange
  17. Client.DefaultRequestHeaders.Add("If-Match", "\"xyzzy\"");
  18. // Act
  19. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/true");
  20. string responseString = await response.Content.ReadAsStringAsync();
  21. // Assert
  22. Assert.Equal(HttpStatusCode.PreconditionFailed, response.StatusCode);
  23. Assert.Equal(string.Empty, responseString);
  24. Assert.NotEqual("bytes", response.Headers.AcceptRanges.ToString());
  25. Assert.Equal(EntityTag, response.Headers.ETag);
  26. Assert.Null(response.Content.Headers.ContentRange);
  27. }
  28. [Fact]
  29. public async Task PreconditionIfMatchEmptySuccessTest()
  30. {
  31. // Arrange
  32. Client.DefaultRequestHeaders.Add("If-Match", "\"xyzzy\"");
  33. // Act
  34. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/false");
  35. string responseString = await response.Content.ReadAsStringAsync();
  36. // Assert
  37. Assert.Equal(HttpStatusCode.OK, response.StatusCode);
  38. Assert.Equal("0123456789abcdefghijklmnopgrstuvwxyzABCDEFGHIJKLMNOPGRSTUVWXYZ", responseString);
  39. Assert.Equal("bytes", response.Headers.AcceptRanges.ToString());
  40. Assert.Null(response.Headers.ETag);
  41. Assert.Null(response.Content.Headers.ContentRange);
  42. }
  43. [Fact]
  44. public async Task PreconditionIfMatchFailWeakTest()
  45. {
  46. // Arrange
  47. string entityTag = EntityTag.ToString();
  48. var tmpNewEntityTag = new EntityTagHeaderValue(entityTag, true);
  49. Client.DefaultRequestHeaders.Add("If-Match", tmpNewEntityTag.ToString());
  50. // Act
  51. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/true");
  52. string responseString = await response.Content.ReadAsStringAsync();
  53. // Assert
  54. Assert.Equal(HttpStatusCode.PreconditionFailed, response.StatusCode);
  55. Assert.Equal(string.Empty, responseString);
  56. Assert.NotEqual("bytes", response.Headers.AcceptRanges.ToString());
  57. Assert.Equal(EntityTag, response.Headers.ETag);
  58. Assert.Null(response.Content.Headers.ContentRange);
  59. }
  60. [Fact]
  61. public async Task PreconditionIfMatchSuccessAnyTest()
  62. {
  63. // Arrange
  64. Client.DefaultRequestHeaders.Add("If-Match", EntityTagHeaderValue.Any.ToString());
  65. // Act
  66. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/true");
  67. response.EnsureSuccessStatusCode();
  68. string responseString = await response.Content.ReadAsStringAsync();
  69. // Assert
  70. Assert.Equal(HttpStatusCode.OK, response.StatusCode);
  71. Assert.Equal("0123456789abcdefghijklmnopgrstuvwxyzABCDEFGHIJKLMNOPGRSTUVWXYZ", responseString);
  72. Assert.Equal("bytes", response.Headers.AcceptRanges.ToString());
  73. Assert.Equal(EntityTag, response.Headers.ETag);
  74. Assert.Null(response.Content.Headers.ContentRange);
  75. }
  76. [Fact]
  77. public async Task PreconditionIfMatchSuccessTest()
  78. {
  79. // Arrange
  80. Client.DefaultRequestHeaders.Add("If-Match", EntityTag.ToString());
  81. // Act
  82. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/true");
  83. response.EnsureSuccessStatusCode();
  84. string responseString = await response.Content.ReadAsStringAsync();
  85. // Assert
  86. Assert.Equal(HttpStatusCode.OK, response.StatusCode);
  87. Assert.Equal("0123456789abcdefghijklmnopgrstuvwxyzABCDEFGHIJKLMNOPGRSTUVWXYZ", responseString);
  88. Assert.Equal("bytes", response.Headers.AcceptRanges.ToString());
  89. Assert.Equal(EntityTag, response.Headers.ETag);
  90. Assert.Null(response.Content.Headers.ContentRange);
  91. }
  92. [Fact]
  93. public async Task PreconditionIfModifiedSinceFailEqualTest()
  94. {
  95. // Arrange
  96. Client.DefaultRequestHeaders.Add("If-Modified-Since", HeaderUtilities.FormatDate(LastModified));
  97. // Act
  98. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/true");
  99. string responseString = await response.Content.ReadAsStringAsync();
  100. // Assert
  101. Assert.Equal(HttpStatusCode.NotModified, response.StatusCode);
  102. Assert.Equal(string.Empty, responseString);
  103. Assert.NotEqual("bytes", response.Headers.AcceptRanges.ToString());
  104. Assert.Equal(EntityTag, response.Headers.ETag);
  105. Assert.Null(response.Content.Headers.ContentRange);
  106. }
  107. [Fact]
  108. public async Task PreconditionIfModifiedSinceFailLessTest()
  109. {
  110. // Arrange
  111. Client.DefaultRequestHeaders.Add("If-Modified-Since", HeaderUtilities.FormatDate(LastModified.AddSeconds(1)));
  112. // Act
  113. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/true");
  114. string responseString = await response.Content.ReadAsStringAsync();
  115. // Assert
  116. Assert.Equal(HttpStatusCode.NotModified, response.StatusCode);
  117. Assert.Equal(string.Empty, responseString);
  118. Assert.NotEqual("bytes", response.Headers.AcceptRanges.ToString());
  119. Assert.Equal(EntityTag, response.Headers.ETag);
  120. Assert.Null(response.Content.Headers.ContentRange);
  121. }
  122. [Fact]
  123. public async Task PreconditionIfModifiedSinceIfNoneMatchSuccessTest()
  124. {
  125. // Arrange
  126. var tmpNewEntityTag = new EntityTagHeaderValue("\"xyzzy\"", true);
  127. Client.DefaultRequestHeaders.Add("If-None-Match", tmpNewEntityTag.ToString());
  128. Client.DefaultRequestHeaders.Add("If-Modified-Since", HeaderUtilities.FormatDate(LastModified.AddSeconds(1)));
  129. // Act
  130. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/true");
  131. response.EnsureSuccessStatusCode();
  132. string responseString = await response.Content.ReadAsStringAsync();
  133. // Assert
  134. Assert.Equal(HttpStatusCode.OK, response.StatusCode);
  135. Assert.Equal("0123456789abcdefghijklmnopgrstuvwxyzABCDEFGHIJKLMNOPGRSTUVWXYZ", responseString);
  136. Assert.Equal("bytes", response.Headers.AcceptRanges.ToString());
  137. Assert.Equal(EntityTag, response.Headers.ETag);
  138. Assert.Null(response.Content.Headers.ContentRange);
  139. }
  140. [Fact]
  141. public async Task PreconditionIfModifiedSinceSuccessLessTest()
  142. {
  143. // Arrange
  144. Client.DefaultRequestHeaders.Add("If-Modified-Since", HeaderUtilities.FormatDate(LastModified.AddSeconds(-1)));
  145. // Act
  146. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/true");
  147. string responseString = await response.Content.ReadAsStringAsync();
  148. // Assert
  149. Assert.Equal(HttpStatusCode.OK, response.StatusCode);
  150. Assert.Equal("0123456789abcdefghijklmnopgrstuvwxyzABCDEFGHIJKLMNOPGRSTUVWXYZ", responseString);
  151. Assert.Equal("bytes", response.Headers.AcceptRanges.ToString());
  152. Assert.Equal(EntityTag, response.Headers.ETag);
  153. Assert.Null(response.Content.Headers.ContentRange);
  154. }
  155. [Fact]
  156. public async Task PreconditionIfModifiedSinceSuccessPutTest()
  157. {
  158. // Arrange
  159. Client.DefaultRequestHeaders.Add("If-Modified-Since", HeaderUtilities.FormatDate(LastModified.AddSeconds(-1)));
  160. // Act
  161. HttpResponseMessage response = await Client.PutAsync("/file/file", new StringContent(string.Empty));
  162. response.EnsureSuccessStatusCode();
  163. string responseString = await response.Content.ReadAsStringAsync();
  164. // Assert
  165. Assert.Equal(HttpStatusCode.OK, response.StatusCode);
  166. Assert.Equal("0123456789abcdefghijklmnopgrstuvwxyzABCDEFGHIJKLMNOPGRSTUVWXYZ", responseString);
  167. Assert.Equal("bytes", response.Headers.AcceptRanges.ToString());
  168. Assert.Equal(EntityTag, response.Headers.ETag);
  169. Assert.Null(response.Content.Headers.ContentRange);
  170. }
  171. [Fact]
  172. public async Task PreconditionIfNoneMatchFailAnyGetTest()
  173. {
  174. // Arrange
  175. Client.DefaultRequestHeaders.Add("If-None-Match", EntityTagHeaderValue.Any.ToString());
  176. // Act
  177. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/true");
  178. string responseString = await response.Content.ReadAsStringAsync();
  179. // Assert
  180. Assert.Equal(HttpStatusCode.NotModified, response.StatusCode);
  181. Assert.Equal(string.Empty, responseString);
  182. Assert.NotEqual("bytes", response.Headers.AcceptRanges.ToString());
  183. Assert.Equal(EntityTag, response.Headers.ETag);
  184. Assert.Null(response.Content.Headers.ContentRange);
  185. }
  186. [Fact]
  187. public async Task PreconditionIfNoneMatchFailAnyPutTest()
  188. {
  189. // Arrange
  190. Client.DefaultRequestHeaders.Add("If-None-Match", EntityTagHeaderValue.Any.ToString());
  191. // Act
  192. HttpResponseMessage response = await Client.PutAsync("/file/file", new StringContent(string.Empty));
  193. string responseString = await response.Content.ReadAsStringAsync();
  194. // Assert
  195. Assert.Equal(HttpStatusCode.NotModified, response.StatusCode);
  196. Assert.Equal(string.Empty, responseString);
  197. Assert.NotEqual("bytes", response.Headers.AcceptRanges.ToString());
  198. Assert.Equal(EntityTag, response.Headers.ETag);
  199. Assert.Null(response.Content.Headers.ContentRange);
  200. }
  201. [Fact]
  202. public async Task PreconditionIfNoneMatchGetFailTest()
  203. {
  204. // Arrange
  205. Client.DefaultRequestHeaders.Add("If-None-Match", EntityTag.ToString());
  206. // Act
  207. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/true");
  208. string responseString = await response.Content.ReadAsStringAsync();
  209. // Assert
  210. Assert.Equal(HttpStatusCode.NotModified, response.StatusCode);
  211. Assert.Equal(string.Empty, responseString);
  212. Assert.NotEqual("bytes", response.Headers.AcceptRanges.ToString());
  213. Assert.Equal(EntityTag, response.Headers.ETag);
  214. Assert.Null(response.Content.Headers.ContentRange);
  215. }
  216. [Fact]
  217. public async Task PreconditionIfNoneMatchGetWeakSuccessTest()
  218. {
  219. // Arrange
  220. string entityTag = EntityTag.ToString();
  221. var tmpNewEntityTag = new EntityTagHeaderValue(entityTag, true);
  222. Client.DefaultRequestHeaders.Add("If-None-Match", tmpNewEntityTag.ToString());
  223. // Act
  224. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/true");
  225. string responseString = await response.Content.ReadAsStringAsync();
  226. // Assert
  227. Assert.Equal(HttpStatusCode.NotModified, response.StatusCode);
  228. Assert.Equal(string.Empty, responseString);
  229. Assert.NotEqual("bytes", response.Headers.AcceptRanges.ToString());
  230. Assert.Equal(EntityTag, response.Headers.ETag);
  231. Assert.Null(response.Content.Headers.ContentRange);
  232. }
  233. [Fact]
  234. public async Task PreconditionIfNoneMatchHeadFailTest()
  235. {
  236. // Arrange
  237. Client.DefaultRequestHeaders.Add("If-None-Match", EntityTag.ToString());
  238. // Act
  239. HttpResponseMessage response = await Client.SendAsync(new HttpRequestMessage(HttpMethod.Head, "/file/file"));
  240. string responseString = await response.Content.ReadAsStringAsync();
  241. // Assert
  242. Assert.Equal(HttpStatusCode.NotModified, response.StatusCode);
  243. Assert.Equal(string.Empty, responseString);
  244. Assert.NotEqual("bytes", response.Headers.AcceptRanges.ToString());
  245. Assert.Equal(EntityTag, response.Headers.ETag);
  246. Assert.Null(response.Content.Headers.ContentRange);
  247. }
  248. [Fact]
  249. public async Task PreconditionIfNoneMatchPutFailTest()
  250. {
  251. // Arrange
  252. Client.DefaultRequestHeaders.Add("If-None-Match", EntityTag.ToString());
  253. // Act
  254. HttpResponseMessage response = await Client.PutAsync("/file/file", new StringContent(string.Empty));
  255. string responseString = await response.Content.ReadAsStringAsync();
  256. // Assert
  257. Assert.Equal(HttpStatusCode.NotModified, response.StatusCode);
  258. Assert.Equal(string.Empty, responseString);
  259. Assert.NotEqual("bytes", response.Headers.AcceptRanges.ToString());
  260. Assert.Equal(EntityTag, response.Headers.ETag);
  261. Assert.Null(response.Content.Headers.ContentRange);
  262. }
  263. [Fact]
  264. public async Task PreconditionIfNoneMatchSuccessTest()
  265. {
  266. // Arrange
  267. Client.DefaultRequestHeaders.Add("If-None-Match", "\"xyzzy\"");
  268. // Act
  269. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/true");
  270. response.EnsureSuccessStatusCode();
  271. string responseString = await response.Content.ReadAsStringAsync();
  272. // Assert
  273. Assert.Equal(HttpStatusCode.OK, response.StatusCode);
  274. Assert.Equal("0123456789abcdefghijklmnopgrstuvwxyzABCDEFGHIJKLMNOPGRSTUVWXYZ", responseString);
  275. Assert.Equal("bytes", response.Headers.AcceptRanges.ToString());
  276. Assert.Equal(EntityTag, response.Headers.ETag);
  277. Assert.Null(response.Content.Headers.ContentRange);
  278. }
  279. [Fact]
  280. public async Task PreconditionIfNoneMatchSuccessWeakTest()
  281. {
  282. // Arrange
  283. var tmpNewEntityTag = new EntityTagHeaderValue("\"xyzzy\"", true);
  284. Client.DefaultRequestHeaders.Add("If-None-Match", tmpNewEntityTag.ToString());
  285. // Act
  286. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/true");
  287. response.EnsureSuccessStatusCode();
  288. string responseString = await response.Content.ReadAsStringAsync();
  289. // Assert
  290. Assert.Equal(HttpStatusCode.OK, response.StatusCode);
  291. Assert.Equal("0123456789abcdefghijklmnopgrstuvwxyzABCDEFGHIJKLMNOPGRSTUVWXYZ", responseString);
  292. Assert.Equal("bytes", response.Headers.AcceptRanges.ToString());
  293. Assert.Equal(EntityTag, response.Headers.ETag);
  294. Assert.Null(response.Content.Headers.ContentRange);
  295. }
  296. [Fact]
  297. public async Task PreconditionIfRangeEtagTest()
  298. {
  299. // Arrange
  300. Client.DefaultRequestHeaders.Add("Range", "bytes=1-1");
  301. Client.DefaultRequestHeaders.Add("If-Range", EntityTag.ToString());
  302. // Act
  303. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/true");
  304. response.EnsureSuccessStatusCode();
  305. string responseString = await response.Content.ReadAsStringAsync();
  306. // Assert
  307. Assert.Equal(HttpStatusCode.PartialContent, response.StatusCode);
  308. Assert.Equal("1", responseString);
  309. Assert.Equal("bytes", response.Headers.AcceptRanges.ToString());
  310. Assert.Equal(EntityTag, response.Headers.ETag);
  311. Assert.NotNull(response.Content.Headers.ContentRange);
  312. Assert.Equal("bytes 1-1/62", response.Content.Headers.ContentRange.ToString());
  313. }
  314. [Fact]
  315. public async Task PreconditionIfRangeIgnoreEtagEmptyTest()
  316. {
  317. // Arrange
  318. Client.DefaultRequestHeaders.Add("Range", "bytes=1-1");
  319. Client.DefaultRequestHeaders.Add("If-Range", EntityTag.ToString());
  320. // Act
  321. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/false");
  322. response.EnsureSuccessStatusCode();
  323. string responseString = await response.Content.ReadAsStringAsync();
  324. // Assert
  325. Assert.Equal(HttpStatusCode.PartialContent, response.StatusCode);
  326. Assert.Equal("1", responseString);
  327. Assert.Equal("bytes", response.Headers.AcceptRanges.ToString());
  328. Assert.Null(response.Headers.ETag);
  329. }
  330. [Fact]
  331. public async Task PreconditionIfRangeIgnoreEtagTest()
  332. {
  333. // Arrange
  334. Client.DefaultRequestHeaders.Add("Range", "bytes=1-1");
  335. Client.DefaultRequestHeaders.Add("If-Range", "\"xyzzy\"");
  336. // Act
  337. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/true");
  338. response.EnsureSuccessStatusCode();
  339. string responseString = await response.Content.ReadAsStringAsync();
  340. // Assert
  341. Assert.Equal(HttpStatusCode.OK, response.StatusCode);
  342. Assert.Equal("0123456789abcdefghijklmnopgrstuvwxyzABCDEFGHIJKLMNOPGRSTUVWXYZ", responseString);
  343. Assert.Equal("bytes", response.Headers.AcceptRanges.ToString());
  344. Assert.Equal(EntityTag, response.Headers.ETag);
  345. Assert.Null(response.Content.Headers.ContentRange);
  346. }
  347. [Fact]
  348. public async Task PreconditionIfRangeIgnoreTest()
  349. {
  350. // Arrange
  351. Client.DefaultRequestHeaders.Add("If-Range", "\"xyzzy\"");
  352. // Act
  353. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/true");
  354. response.EnsureSuccessStatusCode();
  355. string responseString = await response.Content.ReadAsStringAsync();
  356. // Assert
  357. Assert.Equal(HttpStatusCode.OK, response.StatusCode);
  358. Assert.Equal("0123456789abcdefghijklmnopgrstuvwxyzABCDEFGHIJKLMNOPGRSTUVWXYZ", responseString);
  359. Assert.Equal("bytes", response.Headers.AcceptRanges.ToString());
  360. Assert.Equal(EntityTag, response.Headers.ETag);
  361. Assert.Null(response.Content.Headers.ContentRange);
  362. }
  363. [Fact]
  364. public async Task PreconditionIfRangeIgnoreWeakEtagTest()
  365. {
  366. // Arrange
  367. var tmpNewEntityTag = new EntityTagHeaderValue(EntityTag.ToString(), true);
  368. Client.DefaultRequestHeaders.Add("Range", "bytes=1-1");
  369. Client.DefaultRequestHeaders.Add("If-Range", tmpNewEntityTag.ToString());
  370. // Act
  371. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/true");
  372. response.EnsureSuccessStatusCode();
  373. string responseString = await response.Content.ReadAsStringAsync();
  374. // Assert
  375. Assert.Equal(HttpStatusCode.OK, response.StatusCode);
  376. Assert.Equal("0123456789abcdefghijklmnopgrstuvwxyzABCDEFGHIJKLMNOPGRSTUVWXYZ", responseString);
  377. Assert.Equal("bytes", response.Headers.AcceptRanges.ToString());
  378. Assert.Equal(EntityTag, response.Headers.ETag);
  379. Assert.Null(response.Content.Headers.ContentRange);
  380. }
  381. [Fact]
  382. public async Task PreconditionIfRangeLastModifiedEqualTest()
  383. {
  384. // Arrange
  385. Client.DefaultRequestHeaders.Add("Range", "bytes=1-1");
  386. Client.DefaultRequestHeaders.Add("If-Range", HeaderUtilities.FormatDate(LastModified));
  387. // Act
  388. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/true");
  389. response.EnsureSuccessStatusCode();
  390. string responseString = await response.Content.ReadAsStringAsync();
  391. // Assert
  392. Assert.Equal(HttpStatusCode.PartialContent, response.StatusCode);
  393. Assert.Equal("1", responseString);
  394. Assert.Equal("bytes", response.Headers.AcceptRanges.ToString());
  395. Assert.Equal(EntityTag, response.Headers.ETag);
  396. Assert.NotNull(response.Content.Headers.ContentRange);
  397. Assert.Equal("bytes 1-1/62", response.Content.Headers.ContentRange.ToString());
  398. }
  399. [Fact]
  400. public async Task PreconditionIfRangeLastModifiedIgnoreTest()
  401. {
  402. // Arrange
  403. Client.DefaultRequestHeaders.Add("Range", "bytes=1-1");
  404. Client.DefaultRequestHeaders.Add("If-Range", HeaderUtilities.FormatDate(LastModified.AddSeconds(-1)));
  405. // Act
  406. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/true");
  407. response.EnsureSuccessStatusCode();
  408. string responseString = await response.Content.ReadAsStringAsync();
  409. // Assert
  410. Assert.Equal(HttpStatusCode.OK, response.StatusCode);
  411. Assert.Equal("0123456789abcdefghijklmnopgrstuvwxyzABCDEFGHIJKLMNOPGRSTUVWXYZ", responseString);
  412. Assert.Equal("bytes", response.Headers.AcceptRanges.ToString());
  413. Assert.Equal(EntityTag, response.Headers.ETag);
  414. Assert.Null(response.Content.Headers.ContentRange);
  415. }
  416. [Fact]
  417. public async Task PreconditionIfRangeLastModifiedLessTest()
  418. {
  419. // Arrange
  420. Client.DefaultRequestHeaders.Add("Range", "bytes=1-1");
  421. Client.DefaultRequestHeaders.Add("If-Range", HeaderUtilities.FormatDate(LastModified.AddSeconds(1)));
  422. // Act
  423. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/true");
  424. response.EnsureSuccessStatusCode();
  425. string responseString = await response.Content.ReadAsStringAsync();
  426. // Assert
  427. // Assert
  428. Assert.Equal(HttpStatusCode.PartialContent, response.StatusCode);
  429. Assert.Equal("1", responseString);
  430. Assert.Equal("bytes", response.Headers.AcceptRanges.ToString());
  431. Assert.Equal(EntityTag, response.Headers.ETag);
  432. Assert.NotNull(response.Content.Headers.ContentRange);
  433. Assert.Equal("bytes 1-1/62", response.Content.Headers.ContentRange.ToString());
  434. }
  435. [Fact]
  436. public async Task PreconditionIfUnmodifiedSinceFailTest()
  437. {
  438. // Arrange
  439. Client.DefaultRequestHeaders.Add("If-Unmodified-Since", HeaderUtilities.FormatDate(LastModified.AddSeconds(-1)));
  440. // Act
  441. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/true");
  442. string responseString = await response.Content.ReadAsStringAsync();
  443. // Assert
  444. Assert.Equal(HttpStatusCode.PreconditionFailed, response.StatusCode);
  445. Assert.Equal(string.Empty, responseString);
  446. Assert.NotEqual("bytes", response.Headers.AcceptRanges.ToString());
  447. Assert.Equal(EntityTag, response.Headers.ETag);
  448. Assert.Null(response.Content.Headers.ContentRange);
  449. }
  450. [Fact]
  451. public async Task PreconditionIfUnmodifiedSinceIfMatchFailTest()
  452. {
  453. // Arrange
  454. Client.DefaultRequestHeaders.Add("If-Match", EntityTag.ToString());
  455. Client.DefaultRequestHeaders.Add("If-Unmodified-Since", HeaderUtilities.FormatDate(LastModified.AddSeconds(-1)));
  456. // Act
  457. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/true");
  458. string responseString = await response.Content.ReadAsStringAsync();
  459. // Assert
  460. Assert.Equal(HttpStatusCode.PreconditionFailed, response.StatusCode);
  461. Assert.Equal(string.Empty, responseString);
  462. Assert.NotEqual("bytes", response.Headers.AcceptRanges.ToString());
  463. Assert.Equal(EntityTag, response.Headers.ETag);
  464. Assert.Null(response.Content.Headers.ContentRange);
  465. }
  466. [Fact]
  467. public async Task PreconditionIfUnmodifiedSinceSuccessEqualTest()
  468. {
  469. // Arrange
  470. Client.DefaultRequestHeaders.Add("If-Unmodified-Since", HeaderUtilities.FormatDate(LastModified));
  471. // Act
  472. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/true");
  473. string responseString = await response.Content.ReadAsStringAsync();
  474. // Assert
  475. Assert.Equal(HttpStatusCode.OK, response.StatusCode);
  476. Assert.Equal("0123456789abcdefghijklmnopgrstuvwxyzABCDEFGHIJKLMNOPGRSTUVWXYZ", responseString);
  477. Assert.Equal("bytes", response.Headers.AcceptRanges.ToString());
  478. Assert.Equal(EntityTag, response.Headers.ETag);
  479. Assert.Null(response.Content.Headers.ContentRange);
  480. }
  481. [Fact]
  482. public async Task PreconditionIfUnmodifiedSinceSuccessLessTest()
  483. {
  484. // Arrange
  485. Client.DefaultRequestHeaders.Add("If-Unmodified-Since", HeaderUtilities.FormatDate(LastModified.AddSeconds(1)));
  486. // Act
  487. HttpResponseMessage response = await Client.GetAsync("/file/physical/true/true");
  488. response.EnsureSuccessStatusCode();
  489. string responseString = await response.Content.ReadAsStringAsync();
  490. // Assert
  491. Assert.Equal(HttpStatusCode.OK, response.StatusCode);
  492. Assert.Equal("0123456789abcdefghijklmnopgrstuvwxyzABCDEFGHIJKLMNOPGRSTUVWXYZ", responseString);
  493. Assert.Equal("bytes", response.Headers.AcceptRanges.ToString());
  494. Assert.Equal(EntityTag, response.Headers.ETag);
  495. Assert.Null(response.Content.Headers.ContentRange);
  496. }
  497. }
  498. }