def test_merge(self, ): n1 = Network.get(10001) # merge None exists n1.merge(10005) n1_new = Network.get(10001) self.assertEqual(n1.create_at, n1_new.create_at) self.assertEqual(n1.last_active, n1_new.last_active) n2 = Network.get(10002) n1.merge(n2.nid) n1_new = Network.get(10001) self.assertEqual(n1_new.create_at, n1.create_at) self.assertEqual(n1_new.last_active, n2.last_active)
def test_create(self, ): ip = '111.111.111.222' time = datetime.now().replace(microsecond=0) network = Network.create(ip, time) self.assertEqual(network.last_ip, ip) self.assertEqual(network.create_at, time) self.assertEqual(network.last_active, time)
def test_active(self, ): n1 = Network.get(10001) t1 = n1.last_active ip1 = n1.last_ip t = n1.last_active - timedelta(seconds=1) ip = '111.111.111.145' n1.active(ip, t) n1_new = Network.get(10001) self.assertEqual(n1_new.last_ip, ip1) self.assertEqual(n1_new.last_active, t1) t = n1.last_active + timedelta(seconds=1) n1.active(ip, t) n1_new = Network.get(10001) self.assertEqual(n1_new.last_ip, ip) self.assertEqual(n1_new.last_active, t)
def polymerize(self, ip): r2 = self.get_cache_last(ip) if len(r2) == 0: return None r1 = self.get_cache_start(ip) # find uid has max number of uids r = {} for uid, dt in r2.items(): r[uid] = { 'start': r1[uid], 'end': dt, 'count': 0, 'uids': [], } maxUid = None maxCount = 0 for uid, dt in r1.items(): for uid2, c in r.items(): if dt >= c['start'] and dt <= c['end']: c['count'] += 1 c['uids'].append(uid) if c['count'] > maxCount: maxCount = c['count'] maxUid = uid2 # loop find more uids, use plan2 start_time = r1[maxUid] end_time = r2[maxUid] outer = r1.keys() inner = [] # loop find while True: changed = False for uid in outer: if uid in inner: continue if r1[uid] >= start_time and r1[uid] <= end_time: inner.append(uid) if uid in r2 and r2[uid] > end_time: end_time = r2[uid] changed = True continue if uid in r2 and r2[uid] >= start_time and r2[uid] <= end_time: inner.append(uid) if r1[uid] < start_time: start_time = r1[uid] changed = True continue if not changed: break network = Network.create(ip, start_time, end_time) for uid in inner: dt = r2[uid] if uid in r2 else r1[uid] NetworkUser.create(network.nid, uid, ip, dt) # clear log self.clear_cache(ip) return network
def process(self, keys, ip, dt): dt = dt.replace(microsecond=0) uid = self.keys_to_uid(keys, dt) network = Network.get_active(ip) if network is not None: nu = NetworkUser.get_by_uid_nid(network.nid, uid) if nu is not None and \ nu.last_active > dt - timedelta(CONTINUE_ACTIVE): # plan 1 nu.update_active(ip, dt) network.active(ip, dt) self.collect_in_cache(ip, network) return self.cache_log(ip, uid, dt) self.try_polymerize(ip, dt, network)
def test_similar(self, ): n1 = Network.get(10001) n2 = Network.get(10002) self.assertTrue(n1.similar(n2))
def test_remove(self, ): Network.remove(10001) self.assertEqual(Network.get(10001), None)
def test_get_before_time(self, ): time = datetime.strptime("21/04/18 16:32", "%d/%m/%y %H:%M") all = [n for n in Network.get_before_time(time)] self.assertEqual(len(all), 2)