func StoreTest(t *testing.T, s crawler.Store) { equalTime := func(t1, t2 time.Time) bool { return t1.Round(time.Microsecond).Equal( t2.Round(time.Microsecond)) } cmp := func(u, uu *crawler.URL) bool { return u.URL.String() == uu.URL.String() && u.Depth == uu.Depth && u.Status == uu.Status && equalTime(u.Last, uu.Last) && u.NumVisit == uu.NumVisit && u.NumRetry == uu.NumRetry } tm := time.Now().UTC() assert := assert.New(t) u, _ := url.Parse("http://localhost:6060") uu := &crawler.URL{ URL: *u, Last: tm, } ok, err := s.PutNX(uu) assert.NoError(err) assert.True(ok) ok, err = s.PutNX(uu) assert.NoError(err) assert.False(ok) ok, err = s.Exist(u) assert.NoError(err) assert.True(ok) uuu, err := s.Get(u) assert.NoError(err) // assert.Equal(*uu, *uuu) assert.True(cmp(uu, uuu)) uuu.NumVisit++ uuu.Last = time.Now().UTC() assert.NoError(s.Update(uuu)) uu, err = s.Get(u) assert.NoError(err) // assert.Equal(*uuu, *uu) assert.True(cmp(uu, uuu)) uu.Status = crawler.URLStatusError assert.NoError(s.Update(uuu)) uuu, err = s.Get(u) assert.NoError(err) // assert.NotEqual(*uu, *uuu) assert.False(cmp(uu, uuu)) ok, err = s.IsFinished() assert.NoError(err) assert.False(ok) assert.NoError(s.Complete(u)) ok, err = s.IsFinished() assert.NoError(err) assert.True(ok) u.Path = "/hello" uu = &crawler.URL{ URL: *u, } ok, err = s.PutNX(uu) assert.NoError(err) assert.True(ok) ok, err = s.IsFinished() assert.NoError(err) assert.False(ok) assert.NoError(s.Complete(u)) ok, err = s.IsFinished() assert.NoError(err) assert.True(ok) }