示例#1
0
        /// <summary>Regression test for https://github.com/couchbase/couchbase-lite-android-core/issues/70
        ///     </summary>
        /// <exception cref="Couchbase.Lite.CouchbaseLiteException"></exception>
        /// <exception cref="System.IO.IOException"></exception>
        public virtual void TestAttachmentDisappearsAfterSave()
        {
            // create a doc with an attachment
            Document             doc     = database.CreateDocument();
            string               content = "This is a test attachment!";
            ByteArrayInputStream body    = new ByteArrayInputStream(Sharpen.Runtime.GetBytesForString
                                                                        (content));
            UnsavedRevision rev = doc.CreateRevision();

            rev.SetAttachment("index.html", "text/plain; charset=utf-8", body);
            rev.Save();
            // make sure the doc's latest revision has the attachment
            IDictionary <string, object> attachments = (IDictionary)doc.GetCurrentRevision().GetProperty
                                                           ("_attachments");

            NUnit.Framework.Assert.IsNotNull(attachments);
            NUnit.Framework.Assert.AreEqual(1, attachments.Count);
            // make sure the rev has the attachment
            attachments = (IDictionary)rev.GetProperty("_attachments");
            NUnit.Framework.Assert.IsNotNull(attachments);
            NUnit.Framework.Assert.AreEqual(1, attachments.Count);
            // create new properties to add
            IDictionary <string, object> properties = new Dictionary <string, object>();

            properties.Put("foo", "bar");
            // make sure the new rev still has the attachment
            UnsavedRevision rev2 = doc.CreateRevision();

            rev2.GetProperties().PutAll(properties);
            rev2.Save();
            attachments = (IDictionary)rev2.GetProperty("_attachments");
            NUnit.Framework.Assert.IsNotNull(attachments);
            NUnit.Framework.Assert.AreEqual(1, attachments.Count);
        }
示例#2
0
        /// <exception cref="Couchbase.Lite.CouchbaseLiteException"></exception>
        public static Couchbase.Lite.Document CreateTask(Database database, string title,
                                                         Bitmap image, string listId)
        {
            SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
                                                                  );
            Calendar calendar          = GregorianCalendar.GetInstance();
            string   currentTimeString = dateFormatter.Format(calendar.GetTime());
            IDictionary <string, object> properties = new Dictionary <string, object>();

            properties.Put("type", DocType);
            properties.Put("title", title);
            properties.Put("checked", false);
            properties.Put("created_at", currentTimeString);
            properties.Put("list_id", listId);
            Couchbase.Lite.Document document = database.CreateDocument();
            UnsavedRevision         revision = document.CreateRevision();

            revision.SetUserProperties(properties);
            if (image != null)
            {
                ByteArrayOutputStream @out = new ByteArrayOutputStream();
                image.Compress(Bitmap.CompressFormat.Jpeg, 50, @out);
                ByteArrayInputStream @in = new ByteArrayInputStream(@out.ToByteArray());
                revision.SetAttachment("image", "image/jpg", @in);
            }
            revision.Save();
            return(document);
        }
示例#3
0
        /// <exception cref="System.Exception"></exception>
        public virtual void TestCorrectWinningRevisionTiebreaker()
        {
            // Create a conflict on purpose
            Document      doc   = database.CreateDocument();
            SavedRevision rev1  = doc.CreateRevision().Save();
            SavedRevision rev2a = CreateRevisionWithRandomProps(rev1, false);
            SavedRevision rev2b = CreateRevisionWithRandomProps(rev1, true);
            // the tiebreaker will happen based on which rev hash has lexicographically higher sort order
            SavedRevision expectedWinner = null;

            if (Sharpen.Runtime.CompareOrdinal(rev2a.GetId(), rev2b.GetId()) > 0)
            {
                expectedWinner = rev2a;
            }
            else
            {
                if (Sharpen.Runtime.CompareOrdinal(rev2a.GetId(), rev2b.GetId()) < 0)
                {
                    expectedWinner = rev2b;
                }
            }
            RevisionInternal revFound = database.GetDocumentWithIDAndRev(doc.GetId(), null, EnumSet
                                                                         .NoneOf <Database.TDContentOptions>());

            NUnit.Framework.Assert.AreEqual(expectedWinner.GetId(), revFound.GetRevId());
        }
示例#4
0
        /// <summary>https://github.com/couchbase/couchbase-lite-java-core/issues/164</summary>
        /// <exception cref="System.Exception"></exception>
        public virtual void TestRevisionIdEquivalentRevisions()
        {
            // two revisions with the same content and the same json
            // should have the exact same revision id, because their content
            // will have an identical hash
            IDictionary <string, object> properties = new Dictionary <string, object>();

            properties.Put("testName", "testCreateRevisions");
            properties.Put("tag", 1337);
            IDictionary <string, object> properties2 = new Dictionary <string, object>();

            properties2.Put("testName", "testCreateRevisions");
            properties2.Put("tag", 1338);
            Document        doc    = database.CreateDocument();
            UnsavedRevision newRev = doc.CreateRevision();

            newRev.SetUserProperties(properties);
            SavedRevision   rev1     = newRev.Save();
            UnsavedRevision newRev2a = rev1.CreateRevision();

            newRev2a.SetUserProperties(properties2);
            SavedRevision   rev2a    = newRev2a.Save();
            UnsavedRevision newRev2b = rev1.CreateRevision();

            newRev2b.SetUserProperties(properties2);
            SavedRevision rev2b = newRev2b.Save(true);

            NUnit.Framework.Assert.AreEqual(rev2a.GetId(), rev2b.GetId());
        }
示例#5
0
        /// <exception cref="System.Exception"></exception>
        public virtual void TestDocumentChangeListener()
        {
            Document       doc             = database.CreateDocument();
            CountDownLatch documentChanged = new CountDownLatch(1);

            doc.AddChangeListener(new _ChangeListener_324(documentChanged));
            doc.CreateRevision().Save();
            bool success = documentChanged.Await(30, TimeUnit.Seconds);

            NUnit.Framework.Assert.IsTrue(success);
        }
示例#6
0
        /// <exception cref="Couchbase.Lite.CouchbaseLiteException"></exception>
        public virtual void TestLocalChangesAreNotExternal()
        {
            changeNotifications = 0;
            Database.ChangeListener changeListener = new _ChangeListener_43(this);
            database.AddChangeListener(changeListener);
            // Insert a document locally.
            Document document = database.CreateDocument();

            document.CreateRevision().Save();
            // Make sure that the assertion in changeListener was called.
            NUnit.Framework.Assert.AreEqual(1, changeNotifications);
        }
        /// <summary>https://github.com/couchbase/couchbase-lite-android/issues/134</summary>
        /// <exception cref="Couchbase.Lite.CouchbaseLiteException"></exception>
        /// <exception cref="System.IO.IOException"></exception>
        public virtual void TestGetAttachmentBodyUsingPrefetch()
        {
            // add a doc with an attachment
            Document        doc = database.CreateDocument();
            UnsavedRevision rev = doc.CreateRevision();
            IDictionary <string, object> properties = new Dictionary <string, object>();

            properties["foo"] = "bar";
            rev.SetUserProperties(properties);
            byte[]     attachBodyBytes = Sharpen.Runtime.GetBytesForString("attach body");
            Attachment attachment      = new Attachment(new ByteArrayInputStream(attachBodyBytes),
                                                        "text/plain");
            string attachmentName = "test_attachment.txt";

            rev.AddAttachment(attachment, attachmentName);
            rev.Save();
            // do query that finds that doc with prefetch
            View view = database.GetView("aview");

            view.SetMapReduce((IDictionary <string, object> document, EmitDelegate emitter) =>
            {
                string id = (string)document["_id"];
                emitter.Emit(id, null);
            }, null, "1");
            // try to get the attachment
            Query query = view.CreateQuery();

            query.Prefetch = true;
            QueryEnumerator results = query.Run();

            while (results.MoveNext())
            {
                QueryRow row = results.Current;
                // This returns the revision just fine, but the sequence number
                // is set to 0.
                SavedRevision  revision    = row.Document.CurrentRevision;
                IList <string> attachments = revision.AttachmentNames;
                // This returns an Attachment object which looks ok, except again
                // its sequence number is 0. The metadata property knows about
                // the length and mime type of the attachment. It also says
                // "stub" -> "true".
                Attachment attachmentRetrieved = revision.GetAttachment(attachmentName);
                // This throws a CouchbaseLiteException with StatusCode.NOT_FOUND.
                InputStream @is = attachmentRetrieved.GetContent();
                NUnit.Framework.Assert.IsNotNull(@is);
                byte[] attachmentDataRetrieved       = TextUtils.Read(@is);
                string attachmentDataRetrievedString = Sharpen.Runtime.GetStringForBytes(attachmentDataRetrieved
                                                                                         );
                string attachBodyString = Sharpen.Runtime.GetStringForBytes(attachBodyBytes);
                NUnit.Framework.Assert.AreEqual(attachBodyString, attachmentDataRetrievedString);
            }
        }
示例#8
0
        /// <exception cref="Couchbase.Lite.CouchbaseLiteException"></exception>
        public static void AttachImage(Couchbase.Lite.Document task, Bitmap image)
        {
            if (task == null || image == null)
            {
                return;
            }
            UnsavedRevision       revision = task.CreateRevision();
            ByteArrayOutputStream @out     = new ByteArrayOutputStream();

            image.Compress(Bitmap.CompressFormat.Jpeg, 50, @out);
            ByteArrayInputStream @in = new ByteArrayInputStream(@out.ToByteArray());

            revision.SetAttachment("image", "image/jpg", @in);
            revision.Save();
        }
示例#9
0
        /// <exception cref="System.Exception"></exception>
        public virtual void TestCorrectWinningRevisionLongerBranch()
        {
            // Create a conflict on purpose
            Document      doc   = database.CreateDocument();
            SavedRevision rev1  = doc.CreateRevision().Save();
            SavedRevision rev2a = CreateRevisionWithRandomProps(rev1, false);
            SavedRevision rev2b = CreateRevisionWithRandomProps(rev1, true);
            SavedRevision rev3b = CreateRevisionWithRandomProps(rev2b, true);
            // rev3b should be picked as the winner since it has a longer branch
            SavedRevision    expectedWinner = rev3b;
            RevisionInternal revFound       = database.GetDocumentWithIDAndRev(doc.GetId(), null, EnumSet
                                                                               .NoneOf <Database.TDContentOptions>());

            NUnit.Framework.Assert.AreEqual(expectedWinner.GetId(), revFound.GetRevId());
        }
示例#10
0
        /// <summary>https://github.com/couchbase/couchbase-lite-java-core/issues/106</summary>
        /// <exception cref="System.Exception"></exception>
        public virtual void TestResolveConflict()
        {
            IDictionary <string, object> properties = new Dictionary <string, object>();

            properties.Put("testName", "testCreateRevisions");
            properties.Put("tag", 1337);
            // Create a conflict on purpose
            Document        doc     = database.CreateDocument();
            UnsavedRevision newRev1 = doc.CreateRevision();

            newRev1.SetUserProperties(properties);
            SavedRevision rev1       = newRev1.Save();
            SavedRevision rev2a      = CreateRevisionWithRandomProps(rev1, false);
            SavedRevision rev2b      = CreateRevisionWithRandomProps(rev1, true);
            SavedRevision winningRev = null;
            SavedRevision losingRev  = null;

            if (doc.GetCurrentRevisionId().Equals(rev2a.GetId()))
            {
                winningRev = rev2a;
                losingRev  = rev2b;
            }
            else
            {
                winningRev = rev2b;
                losingRev  = rev2a;
            }
            NUnit.Framework.Assert.AreEqual(2, doc.GetConflictingRevisions().Count);
            NUnit.Framework.Assert.AreEqual(2, doc.GetLeafRevisions().Count);
            // let's manually choose the losing rev as the winner.  First, delete winner, which will
            // cause losing rev to be the current revision.
            SavedRevision         deleteRevision       = winningRev.DeleteDocument();
            IList <SavedRevision> conflictingRevisions = doc.GetConflictingRevisions();

            NUnit.Framework.Assert.AreEqual(1, conflictingRevisions.Count);
            NUnit.Framework.Assert.AreEqual(2, doc.GetLeafRevisions().Count);
            NUnit.Framework.Assert.AreEqual(3, deleteRevision.GetGeneration());
            NUnit.Framework.Assert.AreEqual(losingRev.GetId(), doc.GetCurrentRevision().GetId
                                                ());
            // Finally create a new revision rev3 based on losing rev
            SavedRevision rev3 = CreateRevisionWithRandomProps(losingRev, true);

            NUnit.Framework.Assert.AreEqual(rev3.GetId(), doc.GetCurrentRevisionId());
            IList <SavedRevision> conflictingRevisions1 = doc.GetConflictingRevisions();

            NUnit.Framework.Assert.AreEqual(1, conflictingRevisions1.Count);
            NUnit.Framework.Assert.AreEqual(2, doc.GetLeafRevisions().Count);
        }
示例#11
0
        /// <exception cref="System.Exception"></exception>
        public virtual void TestWinningRevIDOfDoc()
        {
            IDictionary <string, object> properties = new Dictionary <string, object>();

            properties.Put("testName", "testCreateRevisions");
            properties.Put("tag", 1337);
            IDictionary <string, object> properties2a = new Dictionary <string, object>();

            properties2a.Put("testName", "testCreateRevisions");
            properties2a.Put("tag", 1338);
            IDictionary <string, object> properties2b = new Dictionary <string, object>();

            properties2b.Put("testName", "testCreateRevisions");
            properties2b.Put("tag", 1339);
            IList <bool> outIsDeleted  = new AList <bool>();
            IList <bool> outIsConflict = new AList <bool>();
            // Create a conflict on purpose
            Document        doc     = database.CreateDocument();
            UnsavedRevision newRev1 = doc.CreateRevision();

            newRev1.SetUserProperties(properties);
            SavedRevision rev1         = newRev1.Save();
            long          docNumericId = database.GetDocNumericID(doc.GetId());

            NUnit.Framework.Assert.IsTrue(docNumericId != 0);
            NUnit.Framework.Assert.AreEqual(rev1.GetId(), database.WinningRevIDOfDoc(docNumericId
                                                                                     , outIsDeleted, outIsConflict));
            NUnit.Framework.Assert.IsTrue(outIsConflict.Count == 0);
            outIsDeleted  = new AList <bool>();
            outIsConflict = new AList <bool>();
            UnsavedRevision newRev2a = rev1.CreateRevision();

            newRev2a.SetUserProperties(properties2a);
            SavedRevision rev2a = newRev2a.Save();

            NUnit.Framework.Assert.AreEqual(rev2a.GetId(), database.WinningRevIDOfDoc(docNumericId
                                                                                      , outIsDeleted, outIsConflict));
            NUnit.Framework.Assert.IsTrue(outIsConflict.Count == 0);
            outIsDeleted  = new AList <bool>();
            outIsConflict = new AList <bool>();
            UnsavedRevision newRev2b = rev1.CreateRevision();

            newRev2b.SetUserProperties(properties2b);
            SavedRevision rev2b = newRev2b.Save(true);

            database.WinningRevIDOfDoc(docNumericId, outIsDeleted, outIsConflict);
            NUnit.Framework.Assert.IsTrue(outIsConflict.Count > 0);
        }
示例#12
0
        /// <summary>https://github.com/couchbase/couchbase-lite-java-core/issues/164</summary>
        /// <exception cref="System.Exception"></exception>
        public virtual void TestRevisionIdDifferentRevisions()
        {
            // two revisions with different json should have different rev-id's
            // because their content will have a different hash (even though
            // they have the same generation number)
            IDictionary <string, object> properties = new Dictionary <string, object>();

            properties.Put("testName", "testCreateRevisions");
            properties.Put("tag", 1337);
            Document        doc    = database.CreateDocument();
            UnsavedRevision newRev = doc.CreateRevision();

            newRev.SetUserProperties(properties);
            SavedRevision rev1  = newRev.Save();
            SavedRevision rev2a = CreateRevisionWithRandomProps(rev1, false);
            SavedRevision rev2b = CreateRevisionWithRandomProps(rev1, true);

            NUnit.Framework.Assert.AreNotSame(rev2a.GetId(), rev2b.GetId());
        }
示例#13
0
        /// <summary>https://github.com/couchbase/couchbase-lite-java-core/issues/106</summary>
        /// <exception cref="System.Exception"></exception>
        public virtual void TestResolveConflict()
        {
            IDictionary <string, object> result;
            // Create a conflict on purpose
            Document      doc        = database.CreateDocument();
            SavedRevision rev1       = doc.CreateRevision().Save();
            SavedRevision rev2a      = CreateRevisionWithRandomProps(rev1, false);
            SavedRevision rev2b      = CreateRevisionWithRandomProps(rev1, true);
            SavedRevision winningRev = null;
            SavedRevision losingRev  = null;

            if (doc.GetCurrentRevisionId().Equals(rev2a.GetId()))
            {
                winningRev = rev2a;
                losingRev  = rev2b;
            }
            else
            {
                winningRev = rev2b;
                losingRev  = rev2a;
            }
            NUnit.Framework.Assert.AreEqual(2, doc.GetConflictingRevisions().Count);
            NUnit.Framework.Assert.AreEqual(2, doc.GetLeafRevisions().Count);
            result = (IDictionary <string, object>)Send("GET", string.Format("/%s/%s?conflicts=true"
                                                                             , DefaultTestDb, doc.GetId()), Status.Ok, null);
            IList <string> conflicts = (IList)result.Get("_conflicts");

            NUnit.Framework.Assert.AreEqual(1, conflicts.Count);
            string conflictingRevId = conflicts[0];

            NUnit.Framework.Assert.AreEqual(losingRev.GetId(), conflictingRevId);
            long docNumericID = database.GetDocNumericID(doc.GetId());

            NUnit.Framework.Assert.IsTrue(docNumericID != 0);
            NUnit.Framework.Assert.IsNotNull(database.GetDocument(doc.GetId()));
            Log.D(Tag, "docNumericID for " + doc.GetId() + " is: " + docNumericID);
            result = (IDictionary <string, object>)Send("DELETE", string.Format("/%s/%s?rev=%s"
                                                                                , DefaultTestDb, doc.GetId(), conflictingRevId), Status.Ok, null);
            result = (IDictionary <string, object>)Send("GET", string.Format("/%s/%s?conflicts=true"
                                                                             , DefaultTestDb, doc.GetId()), Status.Ok, null);
            conflicts = (IList)result.Get("_conflicts");
            NUnit.Framework.Assert.AreEqual(0, conflicts.Count);
        }
示例#14
0
        /// <summary>https://github.com/couchbase/couchbase-lite-java-core/issues/135</summary>
        /// <exception cref="System.Exception"></exception>
        public virtual void TestCorrectWinningRevisionHighRevisionNumber()
        {
            // Create a conflict on purpose
            Document         doc      = database.CreateDocument();
            SavedRevision    rev1     = doc.CreateRevision().Save();
            SavedRevision    rev2a    = CreateRevisionWithRandomProps(rev1, false);
            SavedRevision    rev2b    = CreateRevisionWithRandomProps(rev1, true);
            SavedRevision    rev3b    = CreateRevisionWithRandomProps(rev2b, true);
            SavedRevision    rev4b    = CreateRevisionWithRandomProps(rev3b, true);
            SavedRevision    rev5b    = CreateRevisionWithRandomProps(rev4b, true);
            SavedRevision    rev6b    = CreateRevisionWithRandomProps(rev5b, true);
            SavedRevision    rev7b    = CreateRevisionWithRandomProps(rev6b, true);
            SavedRevision    rev8b    = CreateRevisionWithRandomProps(rev7b, true);
            SavedRevision    rev9b    = CreateRevisionWithRandomProps(rev8b, true);
            SavedRevision    rev10b   = CreateRevisionWithRandomProps(rev9b, true);
            RevisionInternal revFound = database.GetDocumentWithIDAndRev(doc.GetId(), null, EnumSet
                                                                         .NoneOf <Database.TDContentOptions>());

            NUnit.Framework.Assert.AreEqual(rev10b.GetId(), revFound.GetRevId());
        }
示例#15
0
        /// <exception cref="System.Exception"></exception>
        public static Document CreateDocWithAttachment(Database database, string attachmentName
                                                       , string content)
        {
            IDictionary <string, object> properties = new Dictionary <string, object>();

            properties.Put("foo", "bar");
            Document      doc = CreateDocumentWithProperties(database, properties);
            SavedRevision rev = doc.GetCurrentRevision();

            NUnit.Framework.Assert.AreEqual(rev.GetAttachments().Count, 0);
            NUnit.Framework.Assert.AreEqual(rev.GetAttachmentNames().Count, 0);
            NUnit.Framework.Assert.IsNull(rev.GetAttachment(attachmentName));
            ByteArrayInputStream body = new ByteArrayInputStream(Sharpen.Runtime.GetBytesForString
                                                                     (content));
            UnsavedRevision rev2 = doc.CreateRevision();

            rev2.SetAttachment(attachmentName, "text/plain; charset=utf-8", body);
            SavedRevision rev3 = rev2.Save();

            NUnit.Framework.Assert.IsNotNull(rev3);
            NUnit.Framework.Assert.AreEqual(rev3.GetAttachments().Count, 1);
            NUnit.Framework.Assert.AreEqual(rev3.GetAttachmentNames().Count, 1);
            Attachment attach = rev3.GetAttachment(attachmentName);

            NUnit.Framework.Assert.IsNotNull(attach);
            NUnit.Framework.Assert.AreEqual(doc, attach.GetDocument());
            NUnit.Framework.Assert.AreEqual(attachmentName, attach.GetName());
            IList <string> attNames = new AList <string>();

            attNames.AddItem(attachmentName);
            NUnit.Framework.Assert.AreEqual(rev3.GetAttachmentNames(), attNames);
            NUnit.Framework.Assert.AreEqual("text/plain; charset=utf-8", attach.GetContentType
                                                ());
            NUnit.Framework.Assert.AreEqual(IOUtils.ToString(attach.GetContent(), "UTF-8"), content
                                            );
            NUnit.Framework.Assert.AreEqual(Sharpen.Runtime.GetBytesForString(content).Length
                                            , attach.GetLength());
            return(doc);
        }
 // 25 - OK
 /// <exception cref="System.Exception"></exception>
 private SavedRevision CreateTestRevisionNoConflicts(Document doc, string val)
 {
     UnsavedRevision unsavedRev = doc.CreateRevision();
     IDictionary<string, object> props = new Dictionary<string, object>();
     props.Put("key", val);
     unsavedRev.SetUserProperties(props);
     return unsavedRev.Save();
 }
示例#17
0
 private SavedRevision CreateTestRevisionNoConflicts(Document doc, string val) {
     var unsavedRev = doc.CreateRevision();
     var props = new Dictionary<string, object>() 
     {
         {"key", val}
     };
     unsavedRev.SetUserProperties(props);
     return unsavedRev.Save();
 }