public void BatchReaderStreamBoundaryHeaderValidationTest()
        {
            IEnumerable <BoundaryHeaderValidationTestCase> testCases = new BoundaryHeaderValidationTestCase[]
            {
                new BoundaryHeaderValidationTestCase
                {
                    DebugDescription = "Read a changeset part header with the boundary parameter missing.",
                    PayloadFunc      = builder => builder
                                       .Header("Content-Type", "multipart/mixed")
                                       .ResetMemoryStream(),
                    ExpectedException = ODataExpectedExceptions.ODataException("MediaTypeUtils_BoundaryMustBeSpecifiedForBatchPayloads", "multipart/mixed", "boundary"),
                },
                new BoundaryHeaderValidationTestCase
                {
                    DebugDescription = "Read a changeset part header with an invalid boundary parameter name.",
                    PayloadFunc      = builder => builder
                                       .Header("Content-Type", "multipart/mixed;boundary2=changeset_boundary")
                                       .ResetMemoryStream(),
                    ExpectedException = ODataExpectedExceptions.ODataException("MediaTypeUtils_BoundaryMustBeSpecifiedForBatchPayloads", "multipart/mixed;boundary2=changeset_boundary", "boundary"),
                },
                new BoundaryHeaderValidationTestCase
                {
                    DebugDescription = "Read a changeset part header with two boundary parameters.",
                    PayloadFunc      = builder => builder
                                       .Header("Content-Type", "multipart/mixed;boundary=changeset_boundary;boundary=another_boundary")
                                       .ResetMemoryStream(),
                    ExpectedException = ODataExpectedExceptions.ODataException("MediaTypeUtils_BoundaryMustBeSpecifiedForBatchPayloads", "multipart/mixed;boundary=changeset_boundary;boundary=another_boundary", "boundary"),
                },
                new BoundaryHeaderValidationTestCase
                {
                    DebugDescription = "Read a changeset part header with an empty boundary.",
                    PayloadFunc      = builder => builder
                                       .Header("Content-Type", "multipart/mixed;boundary=")
                                       .ResetMemoryStream(),
                    ExpectedException = ODataExpectedExceptions.ODataException("ValidationUtils_InvalidBatchBoundaryDelimiterLength", string.Empty, "70"),
                },
                new BoundaryHeaderValidationTestCase
                {
                    DebugDescription = "Read a changeset part header with multiple parameters (incl. a boundary).",
                    PayloadFunc      = builder => builder
                                       .Header("Content-Type", "multipart/mixed;a=b;boundary=my_boundary;c=d")
                                       .ResetMemoryStream(),
                    ExpectChangeSetPart       = true,
                    ExpectedChangeSetBoundary = "my_boundary"
                },
                new BoundaryHeaderValidationTestCase
                {
                    DebugDescription = "Read a changeset part header where the boundary parameter name has weird casing.",
                    PayloadFunc      = builder => builder
                                       .Header("Content-Type", "multipart/mixed;a=b;BoUnDaRY=my_boundary;c=d")
                                       .ResetMemoryStream(),
                    ExpectChangeSetPart       = true,
                    ExpectedChangeSetBoundary = "my_boundary"
                },
                new BoundaryHeaderValidationTestCase
                {
                    DebugDescription = "Read a changeset part with multiple headers.",
                    PayloadFunc      = builder => builder
                                       .Header("a", "b")
                                       .Header("Content-Type", "multipart/mixed;boundary=my_boundary")
                                       .Header("c", "d")
                                       .Header("e", "f")
                                       .LineFeed()
                                       .String("Some payload")
                                       .ResetMemoryStream(),
                    ExpectChangeSetPart       = true,
                    ExpectedChangeSetBoundary = "my_boundary",
                },
                new BoundaryHeaderValidationTestCase
                {
                    DebugDescription = "Read a changeset part with an invalid header.",
                    PayloadFunc      = builder => builder
                                       .Header("Content-Type", "multipart/mixed;boundary=my_boundary")
                                       .String("InvalidHeader Does not use a colon!")
                                       .ResetMemoryStream(),
                    ExpectChangeSetPart       = true,
                    ExpectedChangeSetBoundary = "my_boundary",
                    ExpectedException         = ODataExpectedExceptions.ODataException("ODataBatchReaderStream_InvalidHeaderSpecified", "InvalidHeader Does not use a colon!"),
                },
                new BoundaryHeaderValidationTestCase
                {
                    DebugDescription = "Read a changeset part with duplicate headers.",
                    PayloadFunc      = builder => builder
                                       .Header("Content-Type", "multipart/mixed;boundary=my_boundary")
                                       .Header("a", "b")
                                       .Header("a", "c")
                                       .LineFeed()
                                       .String("Some payload")
                                       .ResetMemoryStream(),
                    ExpectChangeSetPart       = true,
                    ExpectedChangeSetBoundary = "my_boundary",
                    ExpectedException         = ODataExpectedExceptions.ODataException("ODataBatchReaderStream_DuplicateHeaderFound", "a"),
                },
            };

            this.CombinatorialEngineProvider.RunCombinations(
                testCases,
                (testCase) =>
            {
                this.Injector.InjectDependenciesInto(testCase);
                testCase.Run();
            });
        }
        public void BatchReaderStreamBoundaryHeaderValidationTest()
        {
            IEnumerable<BoundaryHeaderValidationTestCase> testCases = new BoundaryHeaderValidationTestCase[]
            {
                new BoundaryHeaderValidationTestCase
                {
                    DebugDescription = "Read a changeset part header with the boundary parameter missing.",
                    PayloadFunc = builder => builder
                        .Header("Content-Type", "multipart/mixed")
                        .ResetMemoryStream(),
                    ExpectedException = ODataExpectedExceptions.ODataException("MediaTypeUtils_BoundaryMustBeSpecifiedForBatchPayloads", "multipart/mixed", "boundary"),
                },
                new BoundaryHeaderValidationTestCase
                {
                    DebugDescription = "Read a changeset part header with an invalid boundary parameter name.",
                    PayloadFunc = builder => builder
                        .Header("Content-Type", "multipart/mixed;boundary2=changeset_boundary")
                        .ResetMemoryStream(),
                    ExpectedException = ODataExpectedExceptions.ODataException("MediaTypeUtils_BoundaryMustBeSpecifiedForBatchPayloads", "multipart/mixed;boundary2=changeset_boundary", "boundary"),
                },
                new BoundaryHeaderValidationTestCase
                {
                    DebugDescription = "Read a changeset part header with two boundary parameters.",
                    PayloadFunc = builder => builder
                        .Header("Content-Type", "multipart/mixed;boundary=changeset_boundary;boundary=another_boundary")
                        .ResetMemoryStream(),
                    ExpectedException = ODataExpectedExceptions.ODataException("MediaTypeUtils_BoundaryMustBeSpecifiedForBatchPayloads", "multipart/mixed;boundary=changeset_boundary;boundary=another_boundary", "boundary"),
                },
                new BoundaryHeaderValidationTestCase
                {
                    DebugDescription = "Read a changeset part header with an empty boundary.",
                    PayloadFunc = builder => builder
                        .Header("Content-Type", "multipart/mixed;boundary=")
                        .ResetMemoryStream(),
                    ExpectedException = ODataExpectedExceptions.ODataException("ValidationUtils_InvalidBatchBoundaryDelimiterLength", string.Empty, "70"),
                },
                new BoundaryHeaderValidationTestCase
                {
                    DebugDescription = "Read a changeset part header with multiple parameters (incl. a boundary).",
                    PayloadFunc = builder => builder
                        .Header("Content-Type", "multipart/mixed;a=b;boundary=my_boundary;c=d")
                        .ResetMemoryStream(),
                    ExpectChangeSetPart = true,
                    ExpectedChangeSetBoundary = "my_boundary"
                },
                new BoundaryHeaderValidationTestCase
                {
                    DebugDescription = "Read a changeset part header where the boundary parameter name has weird casing.",
                    PayloadFunc = builder => builder
                        .Header("Content-Type", "multipart/mixed;a=b;BoUnDaRY=my_boundary;c=d")
                        .ResetMemoryStream(),
                    ExpectChangeSetPart = true,
                    ExpectedChangeSetBoundary = "my_boundary"
                },
                new BoundaryHeaderValidationTestCase
                {
                    DebugDescription = "Read a changeset part with multiple headers.",
                    PayloadFunc = builder => builder
                        .Header("a", "b")
                        .Header("Content-Type", "multipart/mixed;boundary=my_boundary")
                        .Header("c", "d")
                        .Header("e", "f")
                        .LineFeed()
                        .String("Some payload")
                        .ResetMemoryStream(),
                    ExpectChangeSetPart = true,
                    ExpectedChangeSetBoundary = "my_boundary",
                },
                new BoundaryHeaderValidationTestCase
                {
                    DebugDescription = "Read a changeset part with an invalid header.",
                    PayloadFunc = builder => builder
                        .Header("Content-Type", "multipart/mixed;boundary=my_boundary")
                        .String("InvalidHeader Does not use a colon!")
                        .ResetMemoryStream(),
                    ExpectChangeSetPart = true,
                    ExpectedChangeSetBoundary = "my_boundary",
                    ExpectedException = ODataExpectedExceptions.ODataException("ODataBatchReaderStream_InvalidHeaderSpecified", "InvalidHeader Does not use a colon!"),
                },
                new BoundaryHeaderValidationTestCase
                {
                    DebugDescription = "Read a changeset part with duplicate headers.",
                    PayloadFunc = builder => builder
                        .Header("Content-Type", "multipart/mixed;boundary=my_boundary")
                        .Header("a", "b")
                        .Header("a", "c")
                        .LineFeed()
                        .String("Some payload")
                        .ResetMemoryStream(),
                    ExpectChangeSetPart = true,
                    ExpectedChangeSetBoundary = "my_boundary",
                    ExpectedException = ODataExpectedExceptions.ODataException("ODataBatchReaderStream_DuplicateHeaderFound", "a"),
                },
            };

            this.CombinatorialEngineProvider.RunCombinations(
                testCases,
                (testCase) =>
                {
                    this.Injector.InjectDependenciesInto(testCase);
                    testCase.Run();
                });
        }