本文整理汇总了Golang中github.com/juju/juju/testing.ZeroTime函数的典型用法代码示例。如果您正苦于以下问题:Golang ZeroTime函数的具体用法?Golang ZeroTime怎么用?Golang ZeroTime使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了ZeroTime函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的Golang代码示例。
示例1: TestNoTail
func (s *LogTailerSuite) TestNoTail(c *gc.C) {
expected := logTemplate{Message: "want"}
s.writeLogs(c, 2, expected)
// Write a log entry that's only in the oplog.
doc := s.logTemplateToDoc(logTemplate{Message: "dont want"}, coretesting.ZeroTime())
err := s.writeLogToOplog(doc)
c.Assert(err, jc.ErrorIsNil)
tailer, err := state.NewLogTailer(s.otherState, &state.LogTailerParams{
NoTail: true,
})
c.Assert(err, jc.ErrorIsNil)
// Not strictly necessary, just in case NoTail doesn't work in the test.
defer tailer.Stop()
// Logs only in the oplog shouldn't be reported and the tailer
// should stop itself once the log collection has been read.
s.assertTailer(c, tailer, 2, expected)
select {
case _, ok := <-tailer.Logs():
if ok {
c.Fatal("shouldn't be any further logs")
}
case <-time.After(coretesting.LongWait):
c.Fatal("timed out waiting for logs channel to close")
}
select {
case <-tailer.Dying():
// Success.
case <-time.After(coretesting.LongWait):
c.Fatal("tailer didn't stop itself")
}
}
开发者ID:bac,项目名称:juju,代码行数:35,代码来源:logs_test.go
示例2: TestDbLogger
func (s *LogsSuite) TestDbLogger(c *gc.C) {
logger := state.NewDbLogger(s.State, names.NewMachineTag("22"), jujuversion.Current)
defer logger.Close()
t0 := coretesting.ZeroTime().Truncate(time.Millisecond) // MongoDB only stores timestamps with ms precision.
logger.Log(t0, "some.where", "foo.go:99", loggo.INFO, "all is well")
t1 := t0.Add(time.Second)
logger.Log(t1, "else.where", "bar.go:42", loggo.ERROR, "oh noes")
var docs []bson.M
err := s.logsColl.Find(nil).Sort("t").All(&docs)
c.Assert(err, jc.ErrorIsNil)
c.Assert(docs, gc.HasLen, 2)
c.Assert(docs[0]["t"], gc.Equals, t0.UnixNano())
c.Assert(docs[0]["e"], gc.Equals, s.State.ModelUUID())
c.Assert(docs[0]["n"], gc.Equals, "machine-22")
c.Assert(docs[0]["m"], gc.Equals, "some.where")
c.Assert(docs[0]["l"], gc.Equals, "foo.go:99")
c.Assert(docs[0]["v"], gc.Equals, int(loggo.INFO))
c.Assert(docs[0]["x"], gc.Equals, "all is well")
c.Assert(docs[1]["t"], gc.Equals, t1.UnixNano())
c.Assert(docs[1]["e"], gc.Equals, s.State.ModelUUID())
c.Assert(docs[1]["n"], gc.Equals, "machine-22")
c.Assert(docs[1]["m"], gc.Equals, "else.where")
c.Assert(docs[1]["l"], gc.Equals, "bar.go:42")
c.Assert(docs[1]["v"], gc.Equals, int(loggo.ERROR))
c.Assert(docs[1]["x"], gc.Equals, "oh noes")
}
开发者ID:bac,项目名称:juju,代码行数:29,代码来源:logs_test.go
示例3: TestBuildMetadata
func (s *metadataSuite) TestBuildMetadata(c *gc.C) {
archive, err := os.Create(filepath.Join(c.MkDir(), "juju-backup.tgz"))
c.Assert(err, jc.ErrorIsNil)
_, err = archive.Write([]byte("<compressed data>"))
c.Assert(err, jc.ErrorIsNil)
fi, err := archive.Stat()
c.Assert(err, jc.ErrorIsNil)
finished := backups.FileTimestamp(fi).Unix()
meta, err := backups.BuildMetadata(archive)
c.Assert(err, jc.ErrorIsNil)
c.Check(meta.ID(), gc.Equals, "")
c.Check(meta.Checksum(), gc.Equals, "2jmj7l5rSw0yVb/vlWAYkK/YBwk=")
c.Check(meta.ChecksumFormat(), gc.Equals, "SHA-1, base64 encoded")
c.Check(meta.Size(), gc.Equals, int64(17))
c.Check(meta.Stored(), gc.IsNil)
c.Check(meta.Started.Unix(), gc.Equals, int64(testing.ZeroTime().Unix()))
c.Check(meta.Finished.Unix(), gc.Equals, finished)
c.Check(meta.Notes, gc.Equals, "")
c.Check(meta.Origin.Model, gc.Equals, backups.UnknownString)
c.Check(meta.Origin.Machine, gc.Equals, backups.UnknownString)
c.Check(meta.Origin.Hostname, gc.Equals, backups.UnknownString)
c.Check(meta.Origin.Version.String(), gc.Equals, backups.UnknownVersion.String())
}
开发者ID:bac,项目名称:juju,代码行数:26,代码来源:metadata_test.go
示例4: newFixture
func newFixture(period time.Duration) workerFixture {
return workerFixture{
revisionUpdater: newMockRevisionUpdater(),
clock: testing.NewClock(coretesting.ZeroTime()),
period: period,
}
}
开发者ID:bac,项目名称:juju,代码行数:7,代码来源:worker_test.go
示例5: checkGetSetStatus
func (s *MachineStatusSuite) checkGetSetStatus(c *gc.C) {
now := testing.ZeroTime()
sInfo := status.StatusInfo{
Status: status.Started,
Message: "blah",
Data: map[string]interface{}{
"$foo.bar.baz": map[string]interface{}{
"pew.pew": "zap",
},
},
Since: &now,
}
err := s.machine.SetStatus(sInfo)
c.Check(err, jc.ErrorIsNil)
machine, err := s.State.Machine(s.machine.Id())
c.Assert(err, jc.ErrorIsNil)
statusInfo, err := machine.Status()
c.Check(err, jc.ErrorIsNil)
c.Check(statusInfo.Status, gc.Equals, status.Started)
c.Check(statusInfo.Message, gc.Equals, "blah")
c.Check(statusInfo.Data, jc.DeepEquals, map[string]interface{}{
"$foo.bar.baz": map[string]interface{}{
"pew.pew": "zap",
},
})
c.Check(statusInfo.Since, gc.NotNil)
}
开发者ID:bac,项目名称:juju,代码行数:29,代码来源:status_machine_test.go
示例6: TestBracketedWrite
func (s *SkewSuite) TestBracketedWrite(c *gc.C) {
now := coretesting.ZeroTime()
c.Logf("now: %s", now)
oneSecondAgo := now.Add(-time.Second)
twoSecondsAgo := now.Add(-2 * time.Second)
threeSecondsAgo := now.Add(-3 * time.Second)
fiveSecondsAgo := now.Add(-5 * time.Second)
oneSecondLater := now.Add(time.Second)
// Where T is the current local time:
// between T-5 and T-1, we read T-2 from the remote clock.
skew := lease.Skew{
LastWrite: twoSecondsAgo,
Beginning: fiveSecondsAgo,
End: oneSecondAgo,
}
// If the remote wrote a long time ago -- say, 20 minutes ago it thought
// it was two seconds before now -- its clock could be arbitrarily far
// ahead of ours. But we know that when we started reading, 5 seconds ago,
// it might not have seen a time later than 2 seconds in the past; so
// right now, five seconds after that, it might not have seen a time later
// than three seconds in the future.
c.Check(skew.Earliest(now), gc.DeepEquals, threeSecondsAgo)
// If the remote wrote at the very last moment -- exactly one second ago,
// it thought it was 2 seconds in the past -- it could have a clock one
// second behind ours. If so, the *latest* time at which it might still
// have thought it was before now is one second in the future.
c.Check(skew.Latest(now), gc.DeepEquals, oneSecondLater)
}
开发者ID:bac,项目名称:juju,代码行数:31,代码来源:skew_test.go
示例7: TestApparentPastWrite
func (s *SkewSuite) TestApparentPastWrite(c *gc.C) {
now := coretesting.ZeroTime()
c.Logf("now: %s", now)
oneSecondAgo := now.Add(-time.Second)
threeSecondsAgo := now.Add(-3 * time.Second)
nineSecondsAgo := now.Add(-9 * time.Second)
sixSecondsLater := now.Add(6 * time.Second)
eightSecondsLater := now.Add(8 * time.Second)
// Where T is the current local time:
// between T-3 and T-1, we read T-9 from the remote clock.
skew := lease.Skew{
LastWrite: nineSecondsAgo,
Beginning: threeSecondsAgo,
End: oneSecondAgo,
}
// If the remote wrote a long time ago -- say, 20 minutes ago it thought it
// was 9 seconds ago -- its clock could be arbitrarily far ahead of ours.
// But we know that when we started reading, 3 seconds ago, it might not
// have seen a time later than 9 seconds ago; so right now, three seconds
// after that, it might not have seen a time later than 6 seconds ago.
c.Check(skew.Earliest(now), gc.DeepEquals, sixSecondsLater)
// If the remote wrote at the very last moment -- exactly one second ago,
// it thought it was nine seconds ago -- it could have a clock a full 8
// seconds behind ours. If so, the *latest* time at which it *might* still
// think it's before now is 8 seconds in the future.
c.Check(skew.Latest(now), gc.DeepEquals, eightSecondsLater)
}
开发者ID:bac,项目名称:juju,代码行数:30,代码来源:skew_test.go
示例8: TestSetStatusSince
func (s *ServiceStatusSuite) TestSetStatusSince(c *gc.C) {
now := testing.ZeroTime()
sInfo := status.StatusInfo{
Status: status.Maintenance,
Message: "",
Since: &now,
}
err := s.service.SetStatus(sInfo)
c.Assert(err, jc.ErrorIsNil)
statusInfo, err := s.service.Status()
c.Assert(err, jc.ErrorIsNil)
firstTime := statusInfo.Since
c.Assert(firstTime, gc.NotNil)
c.Assert(timeBeforeOrEqual(now, *firstTime), jc.IsTrue)
// Setting the same status a second time also updates the timestamp.
now = now.Add(1 * time.Second)
sInfo = status.StatusInfo{
Status: status.Maintenance,
Message: "",
Since: &now,
}
err = s.service.SetStatus(sInfo)
c.Assert(err, jc.ErrorIsNil)
statusInfo, err = s.service.Status()
c.Assert(err, jc.ErrorIsNil)
c.Assert(timeBeforeOrEqual(*firstTime, *statusInfo.Since), jc.IsTrue)
}
开发者ID:bac,项目名称:juju,代码行数:28,代码来源:status_service_test.go
示例9: checkGetSetStatus
func (s *ServiceStatusSuite) checkGetSetStatus(c *gc.C) {
now := testing.ZeroTime()
sInfo := status.StatusInfo{
Status: status.Active,
Message: "healthy",
Data: map[string]interface{}{
"$ping": map[string]interface{}{
"foo.bar": 123,
},
},
Since: &now,
}
err := s.service.SetStatus(sInfo)
c.Check(err, jc.ErrorIsNil)
service, err := s.State.Application(s.service.Name())
c.Assert(err, jc.ErrorIsNil)
statusInfo, err := service.Status()
c.Check(err, jc.ErrorIsNil)
c.Check(statusInfo.Status, gc.Equals, status.Active)
c.Check(statusInfo.Message, gc.Equals, "healthy")
c.Check(statusInfo.Data, jc.DeepEquals, map[string]interface{}{
"$ping": map[string]interface{}{
"foo.bar": 123,
},
})
c.Check(statusInfo.Since, gc.NotNil)
}
开发者ID:bac,项目名称:juju,代码行数:29,代码来源:status_service_test.go
示例10: TestSetCharmStoreResourceOkay
func (s *ResourcePersistenceSuite) TestSetCharmStoreResourceOkay(c *gc.C) {
lastPolled := coretesting.NonZeroTime().UTC()
applicationname := "a-application"
res, doc := newPersistenceResource(c, applicationname, "spam")
expected := doc // a copy
expected.DocID += "#charmstore"
expected.Username = ""
expected.Timestamp = coretesting.ZeroTime()
expected.StoragePath = ""
expected.LastPolled = lastPolled
p := NewResourcePersistence(s.base)
ignoredErr := errors.New("<never reached>")
s.stub.SetErrors(nil, nil, nil, ignoredErr)
err := p.SetCharmStoreResource(res.ID, res.ApplicationID, res.Resource.Resource, lastPolled)
c.Assert(err, jc.ErrorIsNil)
s.stub.CheckCallNames(c,
"Run",
"ApplicationExistsOps",
"RunTransaction",
)
s.stub.CheckCall(c, 2, "RunTransaction", []txn.Op{{
C: "resources",
Id: "resource#a-application/spam#charmstore",
Assert: txn.DocMissing,
Insert: &expected,
}, {
C: "application",
Id: "a-application",
Assert: txn.DocExists,
}})
}
开发者ID:bac,项目名称:juju,代码行数:33,代码来源:resources_persistence_test.go
示例11: checkGetSetStatus
func (s *ModelStatusSuite) checkGetSetStatus(c *gc.C) {
now := testing.ZeroTime()
sInfo := status.StatusInfo{
Status: status.Available,
Message: "blah",
Data: map[string]interface{}{
"$foo.bar.baz": map[string]interface{}{
"pew.pew": "zap",
}},
Since: &now,
}
err := s.model.SetStatus(sInfo)
c.Check(err, jc.ErrorIsNil)
model, err := s.State.GetModel(s.model.ModelTag())
c.Assert(err, jc.ErrorIsNil)
statusInfo, err := model.Status()
c.Check(err, jc.ErrorIsNil)
c.Check(statusInfo.Status, gc.Equals, status.Available)
c.Check(statusInfo.Message, gc.Equals, "blah")
c.Check(statusInfo.Data, jc.DeepEquals, map[string]interface{}{
"$foo.bar.baz": map[string]interface{}{
"pew.pew": "zap",
},
})
c.Check(statusInfo.Since, gc.NotNil)
}
开发者ID:bac,项目名称:juju,代码行数:28,代码来源:status_model_test.go
示例12: checkGetSetStatus
func (s *FilesystemStatusSuite) checkGetSetStatus(c *gc.C) {
now := testing.ZeroTime()
sInfo := status.StatusInfo{
Status: status.Attaching,
Message: "blah",
Data: map[string]interface{}{
"$foo.bar.baz": map[string]interface{}{
"pew.pew": "zap",
},
},
Since: &now,
}
err := s.filesystem.SetStatus(sInfo)
c.Check(err, jc.ErrorIsNil)
filesystem, err := s.State.Filesystem(s.filesystem.FilesystemTag())
c.Assert(err, jc.ErrorIsNil)
statusInfo, err := filesystem.Status()
c.Check(err, jc.ErrorIsNil)
c.Check(statusInfo.Status, gc.Equals, status.Attaching)
c.Check(statusInfo.Message, gc.Equals, "blah")
c.Check(statusInfo.Data, jc.DeepEquals, map[string]interface{}{
"$foo.bar.baz": map[string]interface{}{
"pew.pew": "zap",
},
})
c.Check(statusInfo.Since, gc.NotNil)
}
开发者ID:bac,项目名称:juju,代码行数:29,代码来源:status_filesystem_test.go
示例13: checkGetSetStatus
func (s *VolumeStatusSuite) checkGetSetStatus(c *gc.C, volumeStatus status.Status) {
now := testing.ZeroTime()
sInfo := status.StatusInfo{
Status: volumeStatus,
Message: "blah",
Data: map[string]interface{}{
"$foo.bar.baz": map[string]interface{}{
"pew.pew": "zap",
},
},
Since: &now,
}
err := s.volume.SetStatus(sInfo)
c.Check(err, jc.ErrorIsNil)
volume, err := s.State.Volume(s.volume.VolumeTag())
c.Assert(err, jc.ErrorIsNil)
statusInfo, err := volume.Status()
c.Check(err, jc.ErrorIsNil)
c.Check(statusInfo.Status, gc.Equals, volumeStatus)
c.Check(statusInfo.Message, gc.Equals, "blah")
c.Check(statusInfo.Data, jc.DeepEquals, map[string]interface{}{
"$foo.bar.baz": map[string]interface{}{
"pew.pew": "zap",
},
})
c.Check(statusInfo.Since, gc.NotNil)
}
开发者ID:bac,项目名称:juju,代码行数:29,代码来源:status_volume_test.go
示例14: TestModelUsers
func (s *MigrationImportSuite) TestModelUsers(c *gc.C) {
// To be sure with this test, we create three env users, and remove
// the owner.
err := s.State.RemoveUserAccess(s.Owner, s.modelTag)
c.Assert(err, jc.ErrorIsNil)
lastConnection := s.State.NowToTheSecond()
bravo := s.newModelUser(c, "[email protected]", false, lastConnection)
charlie := s.newModelUser(c, "[email protected]", true, lastConnection)
delta := s.newModelUser(c, "[email protected]", true, coretesting.ZeroTime())
newModel, newSt := s.importModel(c)
// Check the import values of the users.
for _, user := range []permission.UserAccess{bravo, charlie, delta} {
newUser, err := newSt.UserAccess(user.UserTag, newModel.Tag())
c.Assert(err, jc.ErrorIsNil)
s.AssertUserEqual(c, newUser, user)
}
// Also make sure that there aren't any more.
allUsers, err := newModel.Users()
c.Assert(err, jc.ErrorIsNil)
c.Assert(allUsers, gc.HasLen, 3)
}
开发者ID:bac,项目名称:juju,代码行数:26,代码来源:migration_import_test.go
示例15: checkGetSetStatus
func (s *StatusUnitAgentSuite) checkGetSetStatus(c *gc.C) {
now := testing.ZeroTime()
sInfo := status.StatusInfo{
Status: status.Idle,
Message: "something",
Data: map[string]interface{}{
"$foo": "bar",
"baz.qux": "ping",
"pong": map[string]interface{}{
"$unset": "txn-revno",
},
},
Since: &now,
}
err := s.agent.SetStatus(sInfo)
c.Check(err, jc.ErrorIsNil)
unit, err := s.State.Unit(s.unit.Name())
c.Assert(err, jc.ErrorIsNil)
agent := unit.Agent()
statusInfo, err := agent.Status()
c.Check(err, jc.ErrorIsNil)
c.Check(statusInfo.Status, gc.Equals, status.Idle)
c.Check(statusInfo.Message, gc.Equals, "something")
c.Check(statusInfo.Data, jc.DeepEquals, map[string]interface{}{
"$foo": "bar",
"baz.qux": "ping",
"pong": map[string]interface{}{
"$unset": "txn-revno",
},
})
c.Check(statusInfo.Since, gc.NotNil)
}
开发者ID:bac,项目名称:juju,代码行数:34,代码来源:status_unitagent_test.go
示例16: TestGetSetErrorStatus
func (s *StatusUnitAgentSuite) TestGetSetErrorStatus(c *gc.C) {
now := testing.ZeroTime()
sInfo := status.StatusInfo{
Status: status.Error,
Message: "test-hook failed",
Data: map[string]interface{}{
"foo": "bar",
},
Since: &now,
}
err := s.agent.SetStatus(sInfo)
c.Assert(err, jc.ErrorIsNil)
// Agent error is reported as unit error.
statusInfo, err := s.unit.Status()
c.Check(err, jc.ErrorIsNil)
c.Check(statusInfo.Status, gc.Equals, status.Error)
c.Check(statusInfo.Message, gc.Equals, "test-hook failed")
c.Check(statusInfo.Data, gc.DeepEquals, map[string]interface{}{
"foo": "bar",
})
// For agents, error is reported as idle.
statusInfo, err = s.agent.Status()
c.Check(err, jc.ErrorIsNil)
c.Check(statusInfo.Status, gc.Equals, status.Idle)
c.Check(statusInfo.Message, gc.Equals, "")
c.Check(statusInfo.Data, gc.HasLen, 0)
}
开发者ID:bac,项目名称:juju,代码行数:29,代码来源:status_unitagent_test.go
示例17: TestCreateInitialUserOps
func (s *internalUserSuite) TestCreateInitialUserOps(c *gc.C) {
tag := names.NewUserTag("AdMiN")
ops := createInitialUserOps(s.state.ControllerUUID(), tag, "abc", "salt", testing.ZeroTime())
c.Assert(ops, gc.HasLen, 3)
op := ops[0]
c.Assert(op.Id, gc.Equals, "admin")
doc := op.Insert.(*userDoc)
c.Assert(doc.DocID, gc.Equals, "admin")
c.Assert(doc.Name, gc.Equals, "AdMiN")
c.Assert(doc.PasswordSalt, gc.Equals, "salt")
// controller user permissions
op = ops[1]
permdoc := op.Insert.(*permissionDoc)
c.Assert(permdoc.Access, gc.Equals, string(permission.SuperuserAccess))
c.Assert(permdoc.ID, gc.Equals, permissionID(controllerKey(s.state.ControllerUUID()), userGlobalKey(strings.ToLower(tag.Id()))))
c.Assert(permdoc.SubjectGlobalKey, gc.Equals, userGlobalKey(strings.ToLower(tag.Id())))
c.Assert(permdoc.ObjectGlobalKey, gc.Equals, controllerKey(s.state.ControllerUUID()))
// controller user
op = ops[2]
cudoc := op.Insert.(*userAccessDoc)
c.Assert(cudoc.ID, gc.Equals, "admin")
c.Assert(cudoc.ObjectUUID, gc.Equals, s.state.ControllerUUID())
c.Assert(cudoc.UserName, gc.Equals, "AdMiN")
c.Assert(cudoc.DisplayName, gc.Equals, "AdMiN")
c.Assert(cudoc.CreatedBy, gc.Equals, "AdMiN")
}
开发者ID:bac,项目名称:juju,代码行数:29,代码来源:user_internal_test.go
示例18: TestApparentFutureWrite
func (s *SkewSuite) TestApparentFutureWrite(c *gc.C) {
now := coretesting.ZeroTime()
c.Logf("now: %s", now)
oneSecondAgo := now.Add(-time.Second)
threeSecondsAgo := now.Add(-3 * time.Second)
tenSecondsAgo := now.Add(-10 * time.Second)
twelveSecondsAgo := now.Add(-12 * time.Second)
nineSecondsLater := now.Add(9 * time.Second)
// Where T is the current local time:
// between T-3 and T-1, we read T+9 from the remote clock.
skew := lease.Skew{
LastWrite: nineSecondsLater,
Beginning: threeSecondsAgo,
End: oneSecondAgo,
}
// If the remote wrote a long time ago -- say, 20 minutes ago it thought
// it was nine seconds after now -- its clock could be arbitrarily far
// ahead of ours. But we know that when we started reading, 3 seconds ago,
// it might not have seen a time later than 9 seconds in the future; so
// right now, three seconds after that, it might not have seen a time later
// than twelve seconds in the future.
c.Check(skew.Earliest(now), gc.DeepEquals, twelveSecondsAgo)
// If the remote wrote at the very last moment -- exactly one second ago,
// it thought it was 9 seconds in the future -- it could have a clock a
// full 10 seconds ahead of ours. If so, the *latest* time at which it
// might still have thought it was before now is ten seconds in the past.
c.Check(skew.Latest(now), gc.DeepEquals, tenSecondsAgo)
}
开发者ID:bac,项目名称:juju,代码行数:31,代码来源:skew_test.go
示例19: checkMetadata
func checkMetadata(c *gc.C, fromDb, metadata *imagestorage.Metadata) {
c.Assert(fromDb.Created.IsZero(), jc.IsFalse)
// We don't want Now() here, we want NonZeroTime().Add(...). Before
// that can happen, we need to look at AddImage for its Created
// timestamp.
c.Assert(fromDb.Created.Before(time.Now()), jc.IsTrue)
fromDb.Created = testing.ZeroTime()
c.Assert(metadata, gc.DeepEquals, fromDb)
}
开发者ID:bac,项目名称:juju,代码行数:9,代码来源:image_test.go
示例20: TestZero
func (s *SkewSuite) TestZero(c *gc.C) {
now := coretesting.ZeroTime()
// The zero Skew should act as unskewed.
skew := lease.Skew{}
c.Check(skew.Earliest(now), gc.Equals, now)
c.Check(skew.Latest(now), gc.Equals, now)
}
开发者ID:bac,项目名称:juju,代码行数:9,代码来源:skew_test.go
注:本文中的github.com/juju/juju/testing.ZeroTime函数示例整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论