public MFTestResults FileShare_Open_Matrix()
        {
            MFTestResults result = MFTestResults.Pass;
            try
            {
                // Given the previous fileshare info and the requested fileaccess and fileshare
                // the following is the ONLY combinations that we should allow -- All others
                // should failed with IOException
                // (Behavior verified on desktop .NET)
                //
                // Previous FileShare   Requested FileAccess    Requested FileShare
                // Read                 Read                    ReadWrite
                // Write                Write                   ReadWrite
                // ReadWrite            Read                    ReadWrite
                // ReadWrite            Write                   ReadWrite
                // ReadWrite            ReadWrite               ReadWrite
                MatrixTestCase[] testCases = new MatrixTestCase[] {
                    // pass cases
                    new MatrixTestCase(FileShare.Read, FileAccess.Read, FileShare.ReadWrite, true),
                    new MatrixTestCase(FileShare.Write, FileAccess.Write, FileShare.ReadWrite, true),
                    new MatrixTestCase(FileShare.ReadWrite, FileAccess.Read, FileShare.ReadWrite, true),
                    new MatrixTestCase(FileShare.ReadWrite, FileAccess.Write, FileShare.ReadWrite, true),
                    new MatrixTestCase(FileShare.ReadWrite, FileAccess.ReadWrite, FileShare.ReadWrite, true),

                    // fail cases
                    new MatrixTestCase(FileShare.Read, FileAccess.Read, FileShare.Read, false),
                    new MatrixTestCase(FileShare.Read, FileAccess.Read, FileShare.Write, false),
                    new MatrixTestCase(FileShare.Read, FileAccess.Read, FileShare.None, false),

                    new MatrixTestCase(FileShare.Read, FileAccess.Write, FileShare.Read, false),
                    new MatrixTestCase(FileShare.Read, FileAccess.Write, FileShare.Write, false),
                    new MatrixTestCase(FileShare.Read, FileAccess.Write, FileShare.ReadWrite, false),
                    new MatrixTestCase(FileShare.Read, FileAccess.Write, FileShare.None, false),

                    new MatrixTestCase(FileShare.Read, FileAccess.ReadWrite, FileShare.Read, false),
                    new MatrixTestCase(FileShare.Read, FileAccess.ReadWrite, FileShare.Write, false),
                    new MatrixTestCase(FileShare.Read, FileAccess.ReadWrite, FileShare.ReadWrite, false),
                    new MatrixTestCase(FileShare.Read, FileAccess.ReadWrite, FileShare.None, false),

                    new MatrixTestCase(FileShare.Write, FileAccess.Read, FileShare.Read, false),
                    new MatrixTestCase(FileShare.Write, FileAccess.Read, FileShare.Write, false),
                    new MatrixTestCase(FileShare.Write, FileAccess.Read, FileShare.ReadWrite, false),
                    new MatrixTestCase(FileShare.Write, FileAccess.Read, FileShare.None, false),

                    new MatrixTestCase(FileShare.Write, FileAccess.Write, FileShare.Read, false),
                    new MatrixTestCase(FileShare.Write, FileAccess.Write, FileShare.Write, false),
                    new MatrixTestCase(FileShare.Write, FileAccess.Write, FileShare.None, false),

                    new MatrixTestCase(FileShare.Write, FileAccess.ReadWrite, FileShare.Read, false),
                    new MatrixTestCase(FileShare.Write, FileAccess.ReadWrite, FileShare.Write, false),
                    new MatrixTestCase(FileShare.Write, FileAccess.ReadWrite, FileShare.ReadWrite, false),
                    new MatrixTestCase(FileShare.Write, FileAccess.ReadWrite, FileShare.None, false),

                    new MatrixTestCase(FileShare.ReadWrite, FileAccess.Read, FileShare.Read, false),
                    new MatrixTestCase(FileShare.ReadWrite, FileAccess.Read, FileShare.Write, false),
                    new MatrixTestCase(FileShare.ReadWrite, FileAccess.Read, FileShare.None, false),

                    new MatrixTestCase(FileShare.ReadWrite, FileAccess.Write, FileShare.Read, false),
                    new MatrixTestCase(FileShare.ReadWrite, FileAccess.Write, FileShare.Write, false),
                    new MatrixTestCase(FileShare.ReadWrite, FileAccess.Write, FileShare.None, false),

                    new MatrixTestCase(FileShare.ReadWrite, FileAccess.ReadWrite, FileShare.Read, false),
                    new MatrixTestCase(FileShare.ReadWrite, FileAccess.ReadWrite, FileShare.Write, false),
                    new MatrixTestCase(FileShare.ReadWrite, FileAccess.ReadWrite, FileShare.None, false),

                    new MatrixTestCase(FileShare.None, FileAccess.Read, FileShare.Read, false),
                    new MatrixTestCase(FileShare.None, FileAccess.Read, FileShare.Write, false),
                    new MatrixTestCase(FileShare.None, FileAccess.Read, FileShare.ReadWrite, false),
                    new MatrixTestCase(FileShare.None, FileAccess.Read, FileShare.None, false),

                    new MatrixTestCase(FileShare.None, FileAccess.Write, FileShare.Read, false),
                    new MatrixTestCase(FileShare.None, FileAccess.Write, FileShare.Write, false),
                    new MatrixTestCase(FileShare.None, FileAccess.Write, FileShare.ReadWrite, false),
                    new MatrixTestCase(FileShare.None, FileAccess.Write, FileShare.None, false),

                    new MatrixTestCase(FileShare.None, FileAccess.ReadWrite, FileShare.Read, false),
                    new MatrixTestCase(FileShare.None, FileAccess.ReadWrite, FileShare.Write, false),
                    new MatrixTestCase(FileShare.None, FileAccess.ReadWrite, FileShare.ReadWrite, false),
                    new MatrixTestCase(FileShare.None, FileAccess.ReadWrite, FileShare.None, false)
                };

                // create file if it doesn't exist.  We are just opening, so worries what it contains
                if (!File.Exists(fileName))
                    File.Create(fileName).Close();

                foreach (MatrixTestCase testcase in testCases)
                {
                    Log.Comment("Previous share: " + testcase.previousShare);
                    Log.Comment("Requested access: " + testcase.requestedAccess);
                    Log.Comment("Requested share: " + testcase.requestedShare);
                    try
                    {
                        using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite, testcase.previousShare))
                        {
                            using (FileStream fs2 = new FileStream(fileName, FileMode.Open, testcase.requestedAccess, testcase.requestedShare)) { }
                            if (!testcase.expectSuccess)
                            {
                                Log.Exception("Unexpected IOException - Expected failure");
                                result = MFTestResults.Fail;
                            }
                            else
                            {
                                Log.Comment("Case passes");
                            }
                        }
                    }
                    catch (IOException)
                    {
                        if (testcase.expectSuccess)
                        {
                            Log.Exception("Unexpected IOException - Expected success");
                            result = MFTestResults.Fail;
                        }
                    }
                    catch (Exception ex)
                    {
                        Log.Exception("Unexpected exception: " + ex.Message);
                        result = MFTestResults.Fail;
                    }
                }

            }
            catch (Exception ex)
            {
                Log.Exception("Unexpected exception: " + ex.Message);
                result = MFTestResults.Fail;
            }

            return result;
        }
        public MFTestResults FileShare_Open_Matrix()
        {
            MFTestResults result = MFTestResults.Pass;

            try
            {
                // Given the previous fileshare info and the requested fileaccess and fileshare
                // the following is the ONLY combinations that we should allow -- All others
                // should failed with IOException
                // (Behavior verified on desktop .NET)
                //
                // Previous FileShare   Requested FileAccess    Requested FileShare
                // Read                 Read                    ReadWrite
                // Write                Write                   ReadWrite
                // ReadWrite            Read                    ReadWrite
                // ReadWrite            Write                   ReadWrite
                // ReadWrite            ReadWrite               ReadWrite
                MatrixTestCase[] testCases = new MatrixTestCase[] {
                    // pass cases
                    new MatrixTestCase(FileShare.Read, FileAccess.Read, FileShare.ReadWrite, true),
                    new MatrixTestCase(FileShare.Write, FileAccess.Write, FileShare.ReadWrite, true),
                    new MatrixTestCase(FileShare.ReadWrite, FileAccess.Read, FileShare.ReadWrite, true),
                    new MatrixTestCase(FileShare.ReadWrite, FileAccess.Write, FileShare.ReadWrite, true),
                    new MatrixTestCase(FileShare.ReadWrite, FileAccess.ReadWrite, FileShare.ReadWrite, true),

                    // fail cases
                    new MatrixTestCase(FileShare.Read, FileAccess.Read, FileShare.Read, false),
                    new MatrixTestCase(FileShare.Read, FileAccess.Read, FileShare.Write, false),
                    new MatrixTestCase(FileShare.Read, FileAccess.Read, FileShare.None, false),

                    new MatrixTestCase(FileShare.Read, FileAccess.Write, FileShare.Read, false),
                    new MatrixTestCase(FileShare.Read, FileAccess.Write, FileShare.Write, false),
                    new MatrixTestCase(FileShare.Read, FileAccess.Write, FileShare.ReadWrite, false),
                    new MatrixTestCase(FileShare.Read, FileAccess.Write, FileShare.None, false),

                    new MatrixTestCase(FileShare.Read, FileAccess.ReadWrite, FileShare.Read, false),
                    new MatrixTestCase(FileShare.Read, FileAccess.ReadWrite, FileShare.Write, false),
                    new MatrixTestCase(FileShare.Read, FileAccess.ReadWrite, FileShare.ReadWrite, false),
                    new MatrixTestCase(FileShare.Read, FileAccess.ReadWrite, FileShare.None, false),

                    new MatrixTestCase(FileShare.Write, FileAccess.Read, FileShare.Read, false),
                    new MatrixTestCase(FileShare.Write, FileAccess.Read, FileShare.Write, false),
                    new MatrixTestCase(FileShare.Write, FileAccess.Read, FileShare.ReadWrite, false),
                    new MatrixTestCase(FileShare.Write, FileAccess.Read, FileShare.None, false),

                    new MatrixTestCase(FileShare.Write, FileAccess.Write, FileShare.Read, false),
                    new MatrixTestCase(FileShare.Write, FileAccess.Write, FileShare.Write, false),
                    new MatrixTestCase(FileShare.Write, FileAccess.Write, FileShare.None, false),

                    new MatrixTestCase(FileShare.Write, FileAccess.ReadWrite, FileShare.Read, false),
                    new MatrixTestCase(FileShare.Write, FileAccess.ReadWrite, FileShare.Write, false),
                    new MatrixTestCase(FileShare.Write, FileAccess.ReadWrite, FileShare.ReadWrite, false),
                    new MatrixTestCase(FileShare.Write, FileAccess.ReadWrite, FileShare.None, false),

                    new MatrixTestCase(FileShare.ReadWrite, FileAccess.Read, FileShare.Read, false),
                    new MatrixTestCase(FileShare.ReadWrite, FileAccess.Read, FileShare.Write, false),
                    new MatrixTestCase(FileShare.ReadWrite, FileAccess.Read, FileShare.None, false),

                    new MatrixTestCase(FileShare.ReadWrite, FileAccess.Write, FileShare.Read, false),
                    new MatrixTestCase(FileShare.ReadWrite, FileAccess.Write, FileShare.Write, false),
                    new MatrixTestCase(FileShare.ReadWrite, FileAccess.Write, FileShare.None, false),

                    new MatrixTestCase(FileShare.ReadWrite, FileAccess.ReadWrite, FileShare.Read, false),
                    new MatrixTestCase(FileShare.ReadWrite, FileAccess.ReadWrite, FileShare.Write, false),
                    new MatrixTestCase(FileShare.ReadWrite, FileAccess.ReadWrite, FileShare.None, false),

                    new MatrixTestCase(FileShare.None, FileAccess.Read, FileShare.Read, false),
                    new MatrixTestCase(FileShare.None, FileAccess.Read, FileShare.Write, false),
                    new MatrixTestCase(FileShare.None, FileAccess.Read, FileShare.ReadWrite, false),
                    new MatrixTestCase(FileShare.None, FileAccess.Read, FileShare.None, false),

                    new MatrixTestCase(FileShare.None, FileAccess.Write, FileShare.Read, false),
                    new MatrixTestCase(FileShare.None, FileAccess.Write, FileShare.Write, false),
                    new MatrixTestCase(FileShare.None, FileAccess.Write, FileShare.ReadWrite, false),
                    new MatrixTestCase(FileShare.None, FileAccess.Write, FileShare.None, false),

                    new MatrixTestCase(FileShare.None, FileAccess.ReadWrite, FileShare.Read, false),
                    new MatrixTestCase(FileShare.None, FileAccess.ReadWrite, FileShare.Write, false),
                    new MatrixTestCase(FileShare.None, FileAccess.ReadWrite, FileShare.ReadWrite, false),
                    new MatrixTestCase(FileShare.None, FileAccess.ReadWrite, FileShare.None, false)
                };

                // create file if it doesn't exist.  We are just opening, so worries what it contains
                if (!File.Exists(fileName))
                {
                    File.Create(fileName).Close();
                }

                foreach (MatrixTestCase testcase in testCases)
                {
                    Log.Comment("Previous share: " + testcase.previousShare);
                    Log.Comment("Requested access: " + testcase.requestedAccess);
                    Log.Comment("Requested share: " + testcase.requestedShare);
                    try
                    {
                        using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite, testcase.previousShare))
                        {
                            using (FileStream fs2 = new FileStream(fileName, FileMode.Open, testcase.requestedAccess, testcase.requestedShare)) { }
                            if (!testcase.expectSuccess)
                            {
                                Log.Exception("Unexpected IOException - Expected failure");
                                result = MFTestResults.Fail;
                            }
                            else
                            {
                                Log.Comment("Case passes");
                            }
                        }
                    }
                    catch (IOException)
                    {
                        if (testcase.expectSuccess)
                        {
                            Log.Exception("Unexpected IOException - Expected success");
                            result = MFTestResults.Fail;
                        }
                    }
                    catch (Exception ex)
                    {
                        Log.Exception("Unexpected exception: " + ex.Message);
                        result = MFTestResults.Fail;
                    }
                }
            }
            catch (Exception ex)
            {
                Log.Exception("Unexpected exception: " + ex.Message);
                result = MFTestResults.Fail;
            }

            return(result);
        }