示例#1
0
        public void testOneBlockAndHalf_BulkWrite()
        {
            TemporaryBuffer b = new TemporaryBuffer();

            byte[] test = new TestRng(getName()).nextBytes(TemporaryBuffer.Block.SZ * 3 / 2);
            try
            {
                b.write(test, 0, 2);
                b.write(test, 2, 4);
                b.write(test, 6, test.Length - 6 - 2);
                b.write(test, test.Length - 2, 2);
                b.close();
                Assert.AreEqual(test.Length, b.Length);
                {
                    byte[] r = b.ToArray();
                    Assert.IsNotNull(r);
                    Assert.AreEqual(test.Length, r.Length);
                    Assert.IsTrue(test.SequenceEqual(r));
                }
                {
                    MemoryStream o = new MemoryStream();
                    b.writeTo(o, null);
                    o.Close();
                    byte[] r = o.ToArray();
                    Assert.AreEqual(test.Length, r.Length);
                    Assert.IsTrue(test.SequenceEqual(r));
                }
            }
            finally
            {
                b.destroy();
            }
        }
示例#2
0
        public void testLarge_SingleWrite()
        {
            TemporaryBuffer b = new TemporaryBuffer();

            byte[] test = new TestRng(getName()).nextBytes(TemporaryBuffer.DEFAULT_IN_CORE_LIMIT * 3);
            try
            {
                b.write(test);
                b.close();
                Assert.AreEqual(test.Length, b.Length);
                {
                    byte[] r = b.ToArray();
                    Assert.IsNotNull(r);
                    Assert.AreEqual(test.Length, r.Length);
                    Assert.IsTrue(test.SequenceEqual(r));
                }
                {
                    MemoryStream o = new MemoryStream();
                    b.writeTo(o, null);
                    o.Close();
                    byte[] r = o.ToArray();
                    Assert.AreEqual(test.Length, r.Length);
                    Assert.IsTrue(test.SequenceEqual(r));
                }
            }
            finally
            {
                b.destroy();
            }
        }
示例#3
0
        public void testOneBlockAndHalf_Copy()
        {
            TemporaryBuffer b = new TemporaryBuffer();

            byte[] test = new TestRng(getName())
                          .nextBytes(TemporaryBuffer.Block.SZ * 3 / 2);
            try
            {
                var @in = new MemoryStream(test);
                // [caytchen] StreamReader buffers data After the very first Read, thus advancing the Position in the underlying stream - causing this test to fail
                //var inReader = new StreamReader(@in);
                b.write(@in.ReadByte());
                b.copy(@in);
                b.close();
                Assert.AreEqual(test.Length, b.Length);
                {
                    byte[] r = b.ToArray();
                    Assert.IsNotNull(r);
                    Assert.AreEqual(test.Length, r.Length);
                    Assert.IsTrue(test.SequenceEqual(r));
                }
                {
                    MemoryStream o = new MemoryStream();
                    b.writeTo(o, null);
                    o.Close();
                    byte[] r = o.ToArray();
                    Assert.AreEqual(test.Length, r.Length);
                    Assert.IsTrue(test.SequenceEqual(r));
                }
            }
            finally
            {
                b.destroy();
            }
        }
示例#4
0
        public void testInCoreLimit_SwitchOnCopy()
        {
            TemporaryBuffer b = new TemporaryBuffer();

            byte[] test = new TestRng(getName())
                          .nextBytes(TemporaryBuffer.DEFAULT_IN_CORE_LIMIT * 2);
            try
            {
                MemoryStream @in = new MemoryStream(test,
                                                    TemporaryBuffer.DEFAULT_IN_CORE_LIMIT, test.Length
                                                    - TemporaryBuffer.DEFAULT_IN_CORE_LIMIT);
                b.write(test, 0, TemporaryBuffer.DEFAULT_IN_CORE_LIMIT);
                b.copy(@in);
                b.close();
                Assert.AreEqual(test.Length, b.Length);
                {
                    byte[] r = b.ToArray();
                    Assert.IsNotNull(r);
                    Assert.AreEqual(test.Length, r.Length);
                    Assert.IsTrue(test.SequenceEqual(r));
                }
                {
                    MemoryStream o = new MemoryStream();
                    b.writeTo(o, null);
                    o.Close();
                    byte[] r = o.ToArray();
                    Assert.AreEqual(test.Length, r.Length);
                    Assert.IsTrue(test.SequenceEqual(r));
                }
            }
            finally
            {
                b.destroy();
            }
        }
示例#5
0
        public void testOneBlockAndHalf_SingleWrite()
        {
            TemporaryBuffer b = new TemporaryBuffer();

            byte[] test = new TestRng(getName())
                          .nextBytes(TemporaryBuffer.Block.SZ * 3 / 2);
            try
            {
                for (int i = 0; i < test.Length; i++)
                {
                    b.write(test[i]);
                }
                b.close();
                Assert.AreEqual(test.Length, b.Length);
                {
                    byte[] r = b.ToArray();
                    Assert.IsNotNull(r);
                    Assert.AreEqual(test.Length, r.Length);
                    Assert.IsTrue(test.SequenceEqual(r));
                }
                {
                    MemoryStream o = new MemoryStream();
                    b.writeTo(o, null);
                    o.Close();
                    byte[] r = o.ToArray();
                    Assert.AreEqual(test.Length, r.Length);
                    Assert.IsTrue(test.SequenceEqual(r));
                }
            }
            finally
            {
                b.destroy();
            }
        }
        public void TemporaryBuffer_Add()
        {
            using var buffer = new TemporaryBuffer <int>(1);

            Assert.Equal(0, buffer.Count);

            buffer.Add(100);
            Assert.Equal(1, buffer.Count);
            Assert.True(buffer.EndsWith(100));
            Assert.False(buffer.EndsWith(new [] { 100, 200 }));
            Assert.False(buffer.EndsWith(new [] { 100, 200, 300 }));
            Assert.Equal(100, buffer.Last());

            buffer.Add(200);
            Assert.Equal(2, buffer.Count);
            Assert.False(buffer.EndsWith(100));
            Assert.True(buffer.EndsWith(new [] { 100, 200 }));
            Assert.False(buffer.EndsWith(new [] { 100, 200, 300 }));
            Assert.Equal(200, buffer.Last());

            buffer.DiscardLast();
            Assert.Equal(1, buffer.Count);
            Assert.True(buffer.EndsWith(100));
            Assert.False(buffer.EndsWith(new [] { 100, 200 }));
            Assert.False(buffer.EndsWith(new [] { 100, 200, 300 }));
            Assert.Equal(100, buffer.Last());

            buffer.Add(200);
            buffer.Add(300);
            Assert.Equal(3, buffer.Count);
            Assert.False(buffer.EndsWith(100));
            Assert.True(buffer.EndsWith(new [] { 200, 300 }));
            Assert.True(buffer.EndsWith(new [] { 100, 200, 300 }));
            Assert.Equal(300, buffer.Last());
        }
示例#7
0
        public void testOneByte()
        {
            TemporaryBuffer b    = new TemporaryBuffer();
            byte            test = (byte)new TestRng(getName()).nextInt();

            try
            {
                b.write(test);
                b.close();
                Assert.AreEqual(1, b.Length);
                {
                    byte[] r = b.ToArray();
                    Assert.IsNotNull(r);
                    Assert.AreEqual(1, r.Length);
                    Assert.AreEqual(test, r[0]);
                }
                {
                    var o = new MemoryStream();
                    b.writeTo(o, null);
                    o.Close();
                    byte[] r = o.ToArray();
                    Assert.AreEqual(1, r.Length);
                    Assert.AreEqual(test, r[0]);
                }
            }
            finally
            {
                b.destroy();
            }
        }
 public Cleaner(IList <char> input)
 {
     buffer               = new TemporaryBuffer <char>(256);
     state                = State.NormalText;
     this.input           = input;
     output               = new List <char>(input.Count);
     templateNestingLevel = 0;
     actionCommitLink     = CommitLink;
 }
示例#9
0
文件: AmazonS3.cs 项目: shoff/ngit
        /// <exception cref="System.IO.IOException"></exception>
        private void PutImpl(string bucket, string key, byte[] csum, TemporaryBuffer buf,
                             ProgressMonitor monitor, string monitorTask)
        {
            if (monitor == null)
            {
                monitor = NullProgressMonitor.INSTANCE;
            }
            if (monitorTask == null)
            {
                monitorTask = MessageFormat.Format(JGitText.Get().progressMonUploading, key);
            }
            string md5str = Base64.EncodeBytes(csum);
            long   len    = buf.Length();
            string lenstr = len.ToString();

            for (int curAttempt = 0; curAttempt < maxAttempts; curAttempt++)
            {
                HttpURLConnection c = Open("PUT", bucket, key);
                c.SetRequestProperty("Content-Length", lenstr);
                c.SetRequestProperty("Content-MD5", md5str);
                c.SetRequestProperty(X_AMZ_ACL, acl);
                encryption.Request(c, X_AMZ_META);
                Authorize(c);
                c.SetDoOutput(true);
                c.SetFixedLengthStreamingMode((int)len);
                monitor.BeginTask(monitorTask, (int)(len / 1024));
                OutputStream os = c.GetOutputStream();
                try
                {
                    buf.WriteTo(os, monitor);
                }
                finally
                {
                    monitor.EndTask();
                    os.Close();
                }
                switch (HttpSupport.Response(c))
                {
                case HttpURLConnection.HTTP_OK:
                {
                    return;
                }

                case HttpURLConnection.HTTP_INTERNAL_ERROR:
                {
                    continue;
                    goto default;
                }

                default:
                {
                    throw Error("Writing", key, c);
                }
                }
            }
            throw MaxAttempts("Writing", key);
        }
示例#10
0
        private void WriteTo(Stream os)
        {
            MessageDigest foot = Constants.newMessageDigest();
            var           dos  = new DigestOutputStream(os, foot);

            // Write the header.
            //
            var tmp = new byte[128];

            Array.Copy(SigDirc, 0, tmp, 0, SigDirc.Length);
            NB.encodeInt32(tmp, 4, /* version */ 2);
            NB.encodeInt32(tmp, 8, _entryCnt);
            dos.Write(tmp, 0, 12);

            // Write the individual file entries.
            //
            if (_lastModified == DateTime.MinValue)
            {
                // Write a new index, as no entries require smudging.
                //
                for (int i = 0; i < _entryCnt; i++)
                {
                    _sortedEntries[i].write(dos);
                }
            }
            else
            {
                var smudge_s  = _lastModified.ToUnixTime();
                var smudge_ns = _lastModified.Millisecond * 1000000;                 // [henon] <--- this could be done with much more precision in C# since DateTime has 100 nanosec ticks
                for (int i = 0; i < _entryCnt; i++)
                {
                    DirCacheEntry e = _sortedEntries[i];
                    if (e.mightBeRacilyClean(smudge_s, smudge_ns))
                    {
                        e.smudgeRacilyClean();
                    }
                    e.write(dos);
                }
            }

            if (_cacheTree != null)
            {
                var bb = new TemporaryBuffer();
                _cacheTree.write(tmp, bb);
                bb.close();

                NB.encodeInt32(tmp, 0, ExtTree);
                NB.encodeInt32(tmp, 4, (int)bb.Length);
                dos.Write(tmp, 0, 8);
                bb.writeTo(dos, null);
            }
            var hash = foot.Digest();

            os.Write(hash, 0, hash.Length);
            os.Close();
        }
        public void TemporaryBuffer_DisposeCanBeCalledManyTimes()
        {
            using var buffer = new TemporaryBuffer <int>(1)
                  {
                      100,
                      200,
                      300
                  };

            buffer.Dispose();
            buffer.Dispose();
        }
示例#12
0
        public void testRandomWrites()
        {
            TemporaryBuffer b   = new TemporaryBuffer();
            TestRng         rng = new TestRng(getName());
            int             max = TemporaryBuffer.DEFAULT_IN_CORE_LIMIT * 2;

            byte[] expect = new byte[max];
            try
            {
                int  written = 0;
                bool onebyte = true;
                while (written < max)
                {
                    if (onebyte)
                    {
                        byte v = (byte)rng.nextInt();
                        b.write(v);
                        expect[written++] = v;
                    }
                    else
                    {
                        int    len = Math.Min(rng.nextInt() & 127, max - written);
                        byte[] tmp = rng.nextBytes(len);
                        b.write(tmp, 0, len);
                        Array.Copy(tmp, 0, expect, written, len);
                        written += len;
                    }
                    onebyte = !onebyte;
                }
                Assert.AreEqual(expect.Length, written);
                b.close();

                Assert.AreEqual(expect.Length, b.Length);
                {
                    byte[] r = b.ToArray();
                    Assert.IsNotNull(r);
                    Assert.AreEqual(expect.Length, r.Length);
                    Assert.IsTrue(expect.SequenceEqual(r));
                }
                {
                    MemoryStream o = new MemoryStream();
                    b.writeTo(o, null);
                    o.Close();
                    byte[] r = o.ToArray();
                    Assert.AreEqual(expect.Length, r.Length);
                    Assert.IsTrue(expect.SequenceEqual(r));
                }
            }
            finally
            {
                b.destroy();
            }
        }
        public void TemporaryBuffer_Insert()
        {
            using var buffer = new TemporaryBuffer <int>(1)
                  {
                      100,
                      200,
                      300
                  };

            buffer.Insert(2, 700);

            Assert.True(buffer.EndsWith(new [] { 700, 300 }));
        }
        public void TemporaryBuffer_DiscardLast()
        {
            using var buffer = new TemporaryBuffer <int>(1)
                  {
                      100,
                      200,
                      300
                  };

            buffer.DiscardLast();

            Assert.Equal(new[] { 100, 200 }, buffer.ToArray());
        }
示例#15
0
        public void testDestroyWhileOpen()
        {
            TemporaryBuffer b = new TemporaryBuffer();

            try
            {
                b.write(new TestRng(getName())
                        .nextBytes(TemporaryBuffer.DEFAULT_IN_CORE_LIMIT * 2));
            }
            finally
            {
                b.destroy();
            }
        }
        public void TemporaryBuffer_Discard()
        {
            using var buffer = new TemporaryBuffer <int>(1)
                  {
                      100,
                      200,
                      300
                  };

            buffer.Discard();

            Assert.Equal(0, buffer.Count);
            Assert.Empty(buffer);
        }
示例#17
0
        private static byte[] ReadFully(Stream stream)
        {
            var b = new TemporaryBuffer();

            try
            {
                b.copy(stream);
                b.close();
                return(b.ToArray());
            }
            finally
            {
                b.destroy();
            }
        }
示例#18
0
        public void testEmpty()
        {
            TemporaryBuffer b = new TemporaryBuffer();

            try
            {
                b.close();
                Assert.AreEqual(0, b.Length);
                byte[] r = b.ToArray();
                Assert.IsNotNull(r);
                Assert.AreEqual(0, r.Length);
            }
            finally
            {
                b.destroy();
            }
        }
        public void TemporaryBuffer_Apply()
        {
            using var buffer = new TemporaryBuffer <int>(1)
                  {
                      100,
                      200,
                      300
                  };

            Func <int[], int, int> sumf = (data, pos) => data.AsSpan().Slice(0, pos).ToArray().Sum();

            int sum = buffer.Apply(sumf);

            Assert.Equal(600, sum);

            sum = 0;
            buffer.Apply((data, pos) => sum = sumf(data, pos));
            Assert.Equal(600, sum);
        }
        public void TemporaryBuffer_CommitAfterDicard()
        {
            using var buffer = new TemporaryBuffer <int>(1)
                  {
                      100,
                      200,
                      300
                  };

            buffer.DiscardLast();
            buffer.Add(700);
            buffer.Add(900);
            buffer.Discard();

            var data = new List <int>();

            buffer.Commit(data);

            Assert.Empty(data);
        }
        public void TemporaryBuffer_Commit()
        {
            using var buffer = new TemporaryBuffer <int>(1)
                  {
                      100,
                      200,
                      300
                  };

            buffer.DiscardLast();
            buffer.Add(700);
            buffer.Add(900);

            var data = new List <int>();

            buffer.Commit(data);

            Assert.Equal(new List <int> {
                100, 200, 700, 900
            }, data);
        }
示例#22
0
        private string[] ExtractFileLines(Encoding[] csGuess)
        {
            var tmp = new TemporaryBuffer[ParentCount + 1];

            try
            {
                for (int i = 0; i < tmp.Length; i++)
                {
                    tmp[i] = new TemporaryBuffer();
                }

                foreach (HunkHeader h in Hunks)
                {
                    h.extractFileLines(tmp);
                }

                var r = new String[tmp.Length];
                for (int i = 0; i < tmp.Length; i++)
                {
                    Encoding cs = (csGuess != null ? csGuess[i] : null) ?? Constants.CHARSET;
                    r[i] = RawParseUtils.decode(cs, tmp[i].ToArray());
                }

                return(r);
            }
            catch (IOException ioe)
            {
                throw new Exception("Cannot convert script to text", ioe);
            }
            finally
            {
                foreach (TemporaryBuffer b in tmp)
                {
                    if (b != null)
                    {
                        b.destroy();
                    }
                }
            }
        }
示例#23
0
 private string[] ExtractFileLines(Encoding[] csGuess)
 {
     TemporaryBuffer[] tmp = new TemporaryBuffer[GetParentCount() + 1];
     try
     {
         for (int i = 0; i < tmp.Length; i++)
         {
             tmp[i] = new TemporaryBuffer.LocalFile();
         }
         foreach (HunkHeader h in GetHunks())
         {
             h.ExtractFileLines(tmp);
         }
         string[] r = new string[tmp.Length];
         for (int i_1 = 0; i_1 < tmp.Length; i_1++)
         {
             Encoding cs = csGuess != null ? csGuess[i_1] : null;
             if (cs == null)
             {
                 cs = Constants.CHARSET;
             }
             r[i_1] = RawParseUtils.Decode(cs, tmp[i_1].ToByteArray());
         }
         return(r);
     }
     catch (IOException ioe)
     {
         throw new RuntimeException(JGitText.Get().cannotConvertScriptToText, ioe);
     }
     finally
     {
         foreach (TemporaryBuffer b in tmp)
         {
             if (b != null)
             {
                 b.Destroy();
             }
         }
     }
 }
示例#24
0
        public void write(byte[] tmp, TemporaryBuffer os)
        {
            int ptr = tmp.Length;

            tmp[--ptr] = (byte)'\n';
            ptr        = RawParseUtils.formatBase10(tmp, ptr, _childCount);
            tmp[--ptr] = (byte)' ';
            ptr        = RawParseUtils.formatBase10(tmp, ptr, isValid() ? _entrySpan : -1);
            tmp[--ptr] = 0;

            os.write(_encodedName, 0, _encodedName.Length);
            os.write(tmp, ptr, tmp.Length - ptr);

            if (isValid())
            {
                _id.copyRawTo(tmp, 0);
                os.write(tmp, 0, Constants.OBJECT_ID_LENGTH);
            }

            for (int i = 0; i < _childCount; i++)
            {
                _children[i].write(tmp, os);
            }
        }