| 2119 | }; |
| 2120 | |
| 2121 | static bool CompareIterators(int step, DB* model, DB* db, |
| 2122 | const Snapshot* model_snap, |
| 2123 | const Snapshot* db_snap) { |
| 2124 | ReadOptions options; |
| 2125 | options.snapshot = model_snap; |
| 2126 | Iterator* miter = model->NewIterator(options); |
| 2127 | options.snapshot = db_snap; |
| 2128 | Iterator* dbiter = db->NewIterator(options); |
| 2129 | bool ok = true; |
| 2130 | int count = 0; |
| 2131 | for (miter->SeekToFirst(), dbiter->SeekToFirst(); |
| 2132 | ok && miter->Valid() && dbiter->Valid(); miter->Next(), dbiter->Next()) { |
| 2133 | count++; |
| 2134 | if (miter->key().compare(dbiter->key()) != 0) { |
| 2135 | fprintf(stderr, "step %d: Key mismatch: '%s' vs. '%s'\n", step, |
| 2136 | EscapeString(miter->key()).c_str(), |
| 2137 | EscapeString(dbiter->key()).c_str()); |
| 2138 | ok = false; |
| 2139 | break; |
| 2140 | } |
| 2141 | |
| 2142 | if (miter->value().compare(dbiter->value()) != 0) { |
| 2143 | fprintf(stderr, "step %d: Value mismatch for key '%s': '%s' vs. '%s'\n", |
| 2144 | step, EscapeString(miter->key()).c_str(), |
| 2145 | EscapeString(miter->value()).c_str(), |
| 2146 | EscapeString(miter->value()).c_str()); |
| 2147 | ok = false; |
| 2148 | } |
| 2149 | } |
| 2150 | |
| 2151 | if (ok) { |
| 2152 | if (miter->Valid() != dbiter->Valid()) { |
| 2153 | fprintf(stderr, "step %d: Mismatch at end of iterators: %d vs. %d\n", |
| 2154 | step, miter->Valid(), dbiter->Valid()); |
| 2155 | ok = false; |
| 2156 | } |
| 2157 | } |
| 2158 | fprintf(stderr, "%d entries compared: ok=%d\n", count, ok); |
| 2159 | delete miter; |
| 2160 | delete dbiter; |
| 2161 | return ok; |
| 2162 | } |
| 2163 | |
| 2164 | TEST(DBTest, Randomized) { |
| 2165 | Random rnd(test::RandomSeed()); |
no test coverage detected