//=========================================================================== // Basic markov data tests //=========================================================================== TEST(MarkovTree,FindNonexistantChainReturnsNull) { MarkovData data(2); data.insert( MC3(aa,bb,cc) ); EXPECT_TRUE( NULL == data.getNodeFor( MC1(xx) ) ); EXPECT_TRUE( NULL == data.getNodeFor( MC2(aa,cc) ) ); }
TEST(MarkovTree,InsertChainCanRetrieveAllLevels) { MarkovData data(2); data.insert( MC3(aa,bb,cc) ); EXPECT_TRUE( testSubchain( data, MC1(aa), 1, 1 ) ); EXPECT_TRUE( testSubchain( data, MC2(aa,bb), 1, 1 ) ); EXPECT_TRUE( testSubchain( data, MC3(aa,bb,cc), 1, 0 ) ); }
//-------------------------------------------------------------------------- // Get PE header // In: ea=DLL imagebase, nh=buffer to keep the answer // child==true:ea is an address in the child process // child==false:ea is an address in the the debugger itself // Returns: offset to the headers, BADADDR means failure ea_t win32_debmod_t::get_pe_header(ea_t ea, peheader_t *nh) { uint32 offset = 0; uint32 magic; if ( _read_memory(ea, &magic, sizeof(magic)) != sizeof(magic) ) return BADADDR; if ( ushort(magic) == MC2('M','Z') ) { if ( _read_memory(ea+PE_PTROFF, &offset, sizeof(offset)) != sizeof(offset) ) return BADADDR; } peheader64_t pe64; if ( _read_memory(ea+offset, &pe64, sizeof(pe64)) != sizeof(pe64) ) return BADADDR; if ( !pe64_to_pe(*nh, pe64, true, true) ) return BADADDR; if ( nh->signature != PEEXE_ID ) return BADADDR; #ifdef __X64__ if ( debapp_attrs.addrsize == 8 && !pe64.is_pe_plus() ) debapp_attrs.addrsize = 4; #endif return offset; }
TEST(MarkovTree,BasicOneLevelTreeSameWeights) { MarkovData data(1); data.insert( MC2(a,b) ); data.insert( MC2(b,c) ); data.insert( MC2(c,d) ); // make sure three nodes at root EXPECT_EQ( 3, data.childrenAtRoot() ); // Verify subchains // {a,b} EXPECT_TRUE( testSubchain(data, MC1(a), 1, 1) ); EXPECT_TRUE( testSubchain(data, MC2(a,b), 1, 0) ); // {b,c} EXPECT_TRUE( testSubchain(data, MC1(b), 1, 1) ); EXPECT_TRUE( testSubchain(data, MC2(b,c), 1, 0) ); // {c,d} EXPECT_TRUE( testSubchain(data, MC1(c), 1, 1) ); EXPECT_TRUE( testSubchain(data, MC2(c,d), 1, 0) ); }
TEST(MarkovChain,ComplexTwoLevelTTreeest) { MarkovData data(2); /** * (ROOT:24) * - A:6 * - B:2 * - A:1 * - D:1 * - C:4 * - D:2 * - A:1 * - C:1 * - B:11 * - B:3 * - A:3 * - A:5 * - A:1 * - B:2 * - C:1 * - D:1 * - C:3 * - A:1 * - D:2 * - C:3 * - B:3 * - D:3 * - D:4 * - A:1 * - C:1 * - B:3 * - A:2 * - D:1 */ data.insert( MC3(a,b,a) ); data.insert( MC3(a,c,c) ); // 1 data.insert( MC3(d,a,c) ); data.insert( MC3(c,b,d) ); // 2 data.insert( MC3(a,c,d) ); data.insert( MC3(a,c,d) ); // 3 data.insert( MC3(b,a,a) ); data.insert( MC3(b,b,a) ); // 4 data.insert( MC3(b,c,a) ); data.insert( MC3(c,b,d) ); // 5 data.insert( MC3(c,b,d) ); data.insert( MC3(a,b,d) ); // 6 data.insert( MC3(a,c,a) ); data.insert( MC3(b,c,d) ); // 7 data.insert( MC3(d,b,a) ); data.insert( MC3(b,c,d) ); // 8 data.insert( MC3(d,b,a) ); data.insert( MC3(d,b,d) ); // 9 data.insert( MC3(b,b,a) ); data.insert( MC3(b,a,c) ); // 10 data.insert( MC3(b,a,b) ); data.insert( MC3(b,a,b) ); // 11 data.insert( MC3(b,a,d) ); data.insert( MC3(b,b,a) ); // 12 // make sure sum is 10 and 3 children EXPECT_EQ( 4, data.childrenAtRoot() ); EXPECT_EQ( 24, data.weightSumAtRoot() ); // Verify chains // a branch EXPECT_TRUE( testSubchain( data, MC1(a), 6, 2 ) ); EXPECT_TRUE( testSubchain( data, MC2(a,b), 2, 2 ) ); EXPECT_TRUE( testSubchain( data, MC2(a,c), 4, 3 ) ); EXPECT_TRUE( testSubchain( data, MC3(a,b,a), 1, 0 ) ); EXPECT_TRUE( testSubchain( data, MC3(a,b,d), 1, 0 ) ); EXPECT_TRUE( testSubchain( data, MC3(a,c,d), 2, 0 ) ); EXPECT_TRUE( testSubchain( data, MC3(a,c,a), 1, 0 ) ); EXPECT_TRUE( testSubchain( data, MC3(a,c,c), 1, 0 ) ); // b branch EXPECT_TRUE( testSubchain( data, MC1(b), 11, 3 ) ); EXPECT_TRUE( testSubchain( data, MC2(b,a), 5, 4 ) ); EXPECT_TRUE( testSubchain( data, MC2(b,b), 3, 1 ) ); EXPECT_TRUE( testSubchain( data, MC2(b,c), 3, 2 ) ); EXPECT_TRUE( testSubchain( data, MC3(b,b,a), 3, 0 ) ); EXPECT_TRUE( testSubchain( data, MC3(b,a,a), 1, 0 ) ); EXPECT_TRUE( testSubchain( data, MC3(b,a,b), 2, 0 ) ); EXPECT_TRUE( testSubchain( data, MC3(b,a,c), 1, 0 ) ); EXPECT_TRUE( testSubchain( data, MC3(b,a,d), 1, 0 ) ); EXPECT_TRUE( testSubchain( data, MC3(b,c,a), 1, 0 ) ); EXPECT_TRUE( testSubchain( data, MC3(b,c,d), 2, 0 ) ); // c branch EXPECT_TRUE( testSubchain( data, MC1(c), 3, 1 ) ); EXPECT_TRUE( testSubchain( data, MC2(c,b), 3, 1 ) ); EXPECT_TRUE( testSubchain( data, MC3(c,b,d), 3, 0 ) ); // d branch EXPECT_TRUE( testSubchain( data, MC1(d), 4, 2 ) ); EXPECT_TRUE( testSubchain( data, MC2(d,a), 1, 1 ) ); EXPECT_TRUE( testSubchain( data, MC2(d,b), 3, 2 ) ); EXPECT_TRUE( testSubchain( data, MC3(d,a,c), 1, 0 ) ); EXPECT_TRUE( testSubchain( data, MC3(d,b,a), 2, 0 ) ); EXPECT_TRUE( testSubchain( data, MC3(d,b,d), 1, 0 ) ); }
//=========================================================================== // Complex higher level tests of markov database //=========================================================================== TEST(MarkovTree,ComplexOneLevelTreeTest) { MarkovData data(1); // ab, bb, bc, cd, bc, ac, ab, ba, bb, bb data.insert( MC2(a,b) ); data.insert( MC2(b,b) ); data.insert( MC2(b,c) ); data.insert( MC2(c,d) ); data.insert( MC2(b,c) ); data.insert( MC2(a,c) ); data.insert( MC2(a,b) ); data.insert( MC2(b,a) ); data.insert( MC2(b,b) ); data.insert( MC2(b,b) ); // make sure sum is 10 and 3 children EXPECT_EQ( 3, data.childrenAtRoot() ); EXPECT_EQ( 10, data.weightSumAtRoot() ); // Verify chains // a branch EXPECT_TRUE( testSubchain( data, MC1(a), 3, 2 ) ); EXPECT_TRUE( testSubchain( data, MC2(a,b), 2, 0 ) ); EXPECT_TRUE( testSubchain( data, MC2(a,c), 1, 0 ) ); // b branch EXPECT_TRUE( testSubchain( data, MC1(b), 6, 3 ) ); EXPECT_TRUE( testSubchain( data, MC2(b,a), 1, 0 ) ); EXPECT_TRUE( testSubchain( data, MC2(b,b), 3, 0 ) ); EXPECT_TRUE( testSubchain( data, MC2(b,c), 2, 0 ) ); // c branch EXPECT_TRUE( testSubchain( data, MC1(c), 1, 1 ) ); EXPECT_TRUE( testSubchain( data, MC2(c,d), 1, 0 ) ); std::cout << data.debugDumpToString() << std::endl; }
TEST(MarkovTree,TwoLengthChainsCanBeNotEqual) { EXPECT_FALSE( isEqual( MC2(bob,david), MC2(nancy,katie) ) ); }
TEST(MarkovTree,SubsetChainsAreNotEqual) { EXPECT_FALSE( isEqual( MC3(nancy,katie,daisy),MC2(nancy,katie) ) ); }
TEST(MarkovTree,TwoLengthChainsAreEqual) { EXPECT_TRUE( isEqual( MC2(nancy, katie), MC2(nancy,katie) ) ); }
TEST(MarkovTree,TwoElementChainToString) { EXPECT_EQ( "<2;apple,peach>", toString( MC2(apple,peach)) ); }