edgex-snap-testing's Issues
Refactor the edgex-no-sec tests to allow custom testing
Currently, the setup installs a bunch of snaps even though only the TestRulesEngine tests use them. It is not possible to run other sub-tests without also having Device Virtual, ASC, eKuiper snaps installed and checked. Those should not be in the global setup and teardown, but instead inside the TestRulesEngine test.
capture edgexfoundry snap logs for each service test suite
Sometimes service test issues might come from platform snap, so it is nice to capture edgexfoundry snap logs for each service test suite.
Allow running all test suites against locally built platform snap
The LOCAL_SNAP environment variable is used for platform or the service snap, depending on the testing suite. The only way to run a device/app/support test against a particular platform snap revision is to use the revision number or branch from the store. This requires first uploading a locally built snap which is very resource consuming.
Example:
PLATFORM_CHANNEL=4259 go test ./test/suites/device-virtual
PLATFORM_CHANNEL=latest/edge/temp-branch go test ./test/suites/device-virtual
The requirement is to allow passing a local snap file path for running any testing suite.
Remove the nonexisted 'secrets-config-processor' service from the edgex-no-sec test
Recently, the 'secrets-config-processor' service was removed, which means that corresponding adjustments need to be made to edgex-no-sec test suite:
Prevent `lsof` logging
This command produces a lot of output, especially when checking platform ports.
edgex-snap-testing/test/utils/net.go
Line 155 in fcd02ae
Related to #29
Add test for checking startup status of oneshot services
Oneshot services:
- security-bootstrapper-redis (oneshot service to setup secure Redis)
- security-consul-bootstrapper (oneshot service to setup secure Consul)
- security-proxy-setup (oneshot service to setup API gateway)
- security-secretstore-setup (oneshot service to setup Vault)
Improve error reporting of the login script
See #171 (comment)
Script to be added by #171 at test/utils/login-test-user.sh
Device USB Camera's RTSP server errors not captured in build logs
The action captures any line containing "error" (case insensitive):
edgex-snap-testing/test/action.yml
Line 69 in 59a2638
The rtsp server uses "ERR" to indicate error logs. Example:
Sep 09 14:32:04 fv-az165-104 edgex-device-usb-camera.rtsp-simple-server[6604]: ERR: yaml: line 75: could not find expected ':'
Sep 09 14:32:04 fv-az165-104 systemd[1]: snap.edgex-device-usb-camera.rtsp-simple-server.service: Main process exited, code=exited, status=1/FAILURE
Sep 09 14:32:04 fv-az165-104 systemd[1]: snap.edgex-device-usb-camera.rtsp-simple-server.service: Failed with result 'exit-code'.
Sep 09 14:32:04 fv-az165-104 systemd[1]: snap.edgex-device-usb-camera.rtsp-simple-server.service: Scheduled restart job, restart counter is at 1.
Make refresh tests work with local builds
Currently, the refresh tests only work with store downloads:
edgex-snap-testing/test/utils/refresh.go
Lines 13 to 15 in 64fb180
We can use snap install
to upgrade to a local build. This will trigger the refresh hooks as when running snap refresh
.
A warning of invalid test repo should be marked as an error
Example: Warning: Unexpected input(s) 'name', 'snap', valid inputs are ['repo']
Here is the full logs.
This type of warning should be treated as a failure, instead of passing the test. The above log shows that the workflow only built the test, without testing it.
Make a list of each test suite's default tests and extra tests in README
A list can help us quickly go through which tests are disabled by default.
For example, in edgexfoundry suite, the refresh test is disabled for a local build snap by default. When a PR is related to upgrading, we need to upload that local build snap to snapstore first, and then manually run the refresh test locally.
Refactor snap and channel variable names
PR #219 added a new variable called LOCAL_PLATFORM_SNAP
, resulting in conditional value passing in the action (see below) and an incorrect reference to the Config Provider snap as a "service" (see below).
edgex-snap-testing/test/action.yml
Lines 63 to 64 in 29eba3e
Instead of
PLATFORM_CHANNEL
SERVICE_CHANNEL
LOCAL_PLATFORM_SNAP
LOCAL_SERVICE_SNAP
We could use the following variables:
PLATFORM_SNAP
ANDSNAP
for path to snap file - matching the action input:snap
.PLATFORM_CHANNEL
ANDCHANNEL
for snap channel when downloading from store - matching the action input:channel
. Theplatform_channel
used only in config provider testing workflow can be removed.
For platform/no-sec tests:
- If
PLATFORM_SNAP
is not set, useSNAP
as its value - If
PLATFORM_CHANNEL
is not set, useCHANNEL
as its value
To run a service test or config provider test and override both snaps platform and the testes snap, set PLATFORM_SNAP=locally-build-edgex-go.snap SNAP=locally-built-app.snap
To test the platform with a local snap: SNAP=locally-build-edgex-go.snap
which would be equivalent to PLATFORM_SNAP=locally-build-edgex-go.snap
because of the above conditional initializations.
Related issue: #60
Remove config override tests after service startup when using config provider
As expected by #4448, the snap tests have started failing since this change because the overrides no longer apply on top of configurations coming from config provider: Common configuration loaded from the Configuration Provider. No overrides applied
Need to change the snap tests to no longer test that, or make the services run without config provider.
Failing test result:
=== RUN TestChangeStartupMsg_app
config_test.go:26: Set and verify new startup message: snap-testing (app)
exec.go:19: [exec] sudo snap set edgexfoundry apps.support-scheduler.config.service-startupmsg='snap-testing (app)'
exec.go:19: [exec] sudo snap restart edgexfoundry.support-scheduler
exec.go:101: [stdout] 2023-03-16T14:24:06Z INFO Waiting for "snap.edgexfoundry.support-scheduler.service" to stop.
exec.go:101: [stdout] Restarted.
net.go:132: Retry 1/180: Waiting for ports: 59880 (core-data), 59881 (core-metadata), 59882 (core-command), 8200 (vault), 8500 (consul), [63](https://github.com/edgexfoundry/edgex-go/actions/runs/4431591455/jobs/7788709103?pr=4449#step:2:67)79 (redis)
config_test.go:109: Retry 1/10: Waiting for startup message: snap-testing (app)
exec.go:19: [exec] sudo journalctl --since "2023-03-16 14:24:05" --no-pager | grep "edgexfoundry.support-scheduler"|| true
config_test.go:109: Retry 2/10: Waiting for startup message: snap-testing (app)
exec.go:19: [exec] sudo journalctl --since "2023-03-16 14:24:05" --no-pager | grep "edgexfoundry.support-scheduler"|| true
config_test.go:109: Retry 3/10: Waiting for startup message: snap-testing (app)
exec.go:19: [exec] sudo journalctl --since "2023-03-16 14:24:05" --no-pager | grep "edgexfoundry.support-scheduler"|| true
config_test.go:109: Retry 4/10: Waiting for startup message: snap-testing (app)
exec.go:19: [exec] sudo journalctl --since "2023-03-16 14:24:05" --no-pager | grep "edgexfoundry.support-scheduler"|| true
config_test.go:109: Retry 5/10: Waiting for startup message: snap-testing (app)
exec.go:19: [exec] sudo journalctl --since "2023-03-16 14:24:05" --no-pager | grep "edgexfoundry.support-scheduler"|| true
config_test.go:109: Retry 6/10: Waiting for startup message: snap-testing (app)
exec.go:19: [exec] sudo journalctl --since "2023-03-16 14:24:05" --no-pager | grep "edgexfoundry.support-scheduler"|| true
config_test.go:109: Retry 7/10: Waiting for startup message: snap-testing (app)
exec.go:19: [exec] sudo journalctl --since "2023-03-16 14:24:05" --no-pager | grep "edgexfoundry.support-scheduler"|| true
config_test.go:109: Retry 8/10: Waiting for startup message: snap-testing (app)
exec.go:19: [exec] sudo journalctl --since "2023-03-16 14:24:05" --no-pager | grep "edgexfoundry.support-scheduler"|| true
config_test.go:109: Retry 9/10: Waiting for startup message: snap-testing (app)
exec.go:19: [exec] sudo journalctl --since "2023-03-16 14:24:05" --no-pager | grep "edgexfoundry.support-scheduler"|| true
config_test.go:109: Retry 10/10: Waiting for startup message: snap-testing (app)
exec.go:19: [exec] sudo journalctl --since "2023-03-16 14:24:05" --no-pager | grep "edgexfoundry.support-scheduler"|| true
config_test.go:118: Time out: reached max 10 retries.
config_test.go:31:
Error Trace: /home/runner/work/_actions/canonical/edgex-snap-testing/v3/test/suites/edgexfoundry/config_test.go:31
Error: Should be true
Test: TestChangeStartupMsg_app
Messages: new startup message = snap-testing (app)
Manual edgex-secretstore-token connection should happen after platform installation
Currently, platform snap installation happens after local snap installation and edgex-secret-token connection, and it will cause an error. Here is an example:
[exec] sudo snap install --dangerous app-rfid-llrp-inventory/edgex-app-rfid-llrp-inventory_2.1.0-dev.3_amd64.snap
[stdout] edgex-app-rfid-llrp-inventory 2.1.0-dev.3 installed
[exec] sudo snap connect edgexfoundry:edgex-secretstore-token edgex-app-rfid-llrp-inventory:edgex-secretstore-token
stderr] error: snap "edgexfoundry" is not installed
exit status 1
This need to be fixed in all test suites. Maybe remove following line before local snap installation:
Extend the list of platform ports
The list is not complete:
edgex-snap-testing/test/utils/net.go
Lines 13 to 22 in fcd02ae
See:
https://docs.edgexfoundry.org/2.2/general/ServicePorts/
Replace deprecated `set-output` command
Warning shown in tests:
The
set-output
command is deprecated and will be disabled soon. Please upgrade to using Environment Files. For more information see: https://github.blog/changelog/2022-10-11-github-actions-deprecating-save-state-and-set-output-commands/
eKuiper tests using deprecated App Service Config app
The standalone eKuiper tests use edgexfoundry's internal app service configurable which is meant for use by the internal kuiper.
The test should use the standalone app-service-configurable snap.
Upgrade download-artifact action to replace deprecated Node.js
Warning in tests:
Node.js 12 actions are deprecated. Please update the following actions to use Node.js 16: actions/download-artifact@v2. For more information see: https://github.blog/changelog/2022-09-22-github-actions-all-actions-will-begin-running-on-node16-instead-of-node12/.
Make Teardown an optional step
When running the tests on ephemeral CI instances, the removal of snaps in the teardown is unnecessary and time consuming.
It would be beneficial to allow skipping of the cleanup operations after the tests and set that to default in Github workflows and other automated tests.
Error when setting custom certificate after adding proxy user
When using snap options, Kong gives either of the following errors:
list Kong tls snis certificates request failed with code: 401
list Kong tls snis certificates request failed with code: 403
See https://github.com/canonical/edgex-snap-testing/runs/7182457609?check_suite_focus=true#step:4:353
This doesn't happen when the custom certificate is added before addition of the proxy user!
Separate refresh test suites
The refresh test requires a very different setup and teardown process because it involves upgrading from an older to the current (under test) snap. This adds complication because when refresh tests run in the middle of other tests, the current snap is removed in setup and installed again in teardown.
Testing the refresh test alone will result in an unwanted workflow:
- install current (global setup)
- remove current (setup)
- install old snap (setup)
- refresh to current
- remove current (cleanup)
- install current (cleanup)
- remove current (global teardown)
go test -p 1 ./test/suites/edgexfoundry -run=TestCommon/refresh -v
Add secrets config test to replace the TLS certificate
This issue is to add a new test suite to verify the functionality of snapped secrets-config
CLI. The steps for such test can be based on the documentation: https://docs.edgexfoundry.org/3.0/getting-started/Ch-GettingStartedSnapUsers/#changing-tls-certificates
Some testing code can be borrowed from what was removed in #188
For simplicity, the TLS cert creation can be done in bash, similar to https://gist.github.com/farshidtz/8fe88373a5ef1243847282f29a06184f
Handle the max retries error that was left uncaught in the config provider test
please refer to canonical/edgex-config-provider#15 (comment)
Enable debug mode on all snaps by default for more effective debugging
Upgrade device-virtual in ekuiper test when it is available in `latest/stable` channel
Inconsistent variable names for channel input
The channel of the snap that is tested is passed to the action using the channel
input:
edgex-snap-testing/test/action.yml
Lines 16 to 20 in ed0a32e
However, the environment variable and internal global variables are "service channel":
edgex-snap-testing/test/action.yml
Line 51 in ed0a32e
edgex-snap-testing/test/utils/env.go
Line 16 in ed0a32e
This adds some confusion because when testing edgexfoundry
, the channel
input makes sense from the workflow but internally, the "service channel" is misleading since this isn't a service.
I suggest renaming the env var and global var to just "channel" to be consistent with the action input.
Exec util randomly fails to return standard output
=== RUN TestExec/one_command
exec.go:82: [exec] echo "hi"
exec_test.go:16:
Error Trace: exec_test.go:16
Error: Not equal:
expected: "hi\n"
actual : ""
Diff:
--- Expected
+++ Actual
@@ -1,2 +1 @@
-hi
Test: TestExec/one_command
E.g.:
- https://github.com/canonical/edgex-snap-testing/runs/5648874386?check_suite_focus=true#step:4:13
- https://github.com/canonical/edgex-snap-testing/runs/5773307519?check_suite_focus=true#step:4:22
- https://github.com/canonical/edgex-snap-testing/runs/5814665291?check_suite_focus=true#step:4:27
Reproduce:
Comment out the slow "exit after slow command" subtest and run:
go test ./test/utils -count=1000
Test action produces too much logs on error
The snap logs are grouped. The group is collapsed when there is no error. However, the group is open by default when some testing errors happen. Because the logs are too long, this makes it very difficult to see the actual testing results.
Options:
- Print only errors and upload full log as artifact
- Find a way to keep the logs always collapsed
Keep the ASC tests alongside the default mode in ekuiper suite
Since canonical/edgex-ekuiper-snap#34, eKuiper snap subscribes to all messages on the EdgeX message bus by default. The tests have been modified accordingly in #125, replacing the original ones which were assuming subscription to the EdgeX App Service Configurable by default.
To extend the testing coverage, the testing suite needs to add tests that configure eKuiper to subscribe to messages filtered by EdgeX App Service Configurable.
Originally posted by @farshidtz in #125 (review)
Upstream testing workflow
Questions:
- Should it trigger on PR and on push (current) or just on PR?
- Fine for now.
- Should it allow manual trigger other than by project committers?
- Ok for now
- Should passing the checks be required to merge PRs or optional?
- Discuss in TSC
- How to remove the now obsolete snap build from the jenkins pipelines?
- Disable one by one when tests become available. E.g. https://github.com/edgexfoundry/device-mqtt-go/blob/9225b543fa42775eff825b7d98be0ff13d95165d/Jenkinsfile#L19
- Move tests source code to upstream?
- Maybe
- Tests moved to source code?
- Adds to upstream code base
- Not always possible, e.g. when testing a 3rd party snap.
Bind address already in use
Tests occasionally fail on Github because the bind address with default ports isn’t available. It isn’t clear if there is an error in services or if the ports are used by some other processes. We’ve seen this for 59880 (core data), 59882 (core command).
When this happens, the services restart very quickly and then disable. This is because the default restart delay from systemd is 100ms without any increments, unlike docker. See systemd/systemd#6129
The attached logs shows core command restarting 9 times in 7 seconds before being permanently stopped:
Aug 12 14:02:29 fv-az41-871 edgexfoundry.core-command[5432]: level=ERROR ts=2022-08-12T14:02:29.075056424Z app=core-command source=httpserver.go:146 msg="Web server failed: listen tcp 127.0.0.1:59882: bind: address already in use"
...
Aug 12 14:02:30 fv-az41-871 systemd[1]: snap.edgexfoundry.core-command.service: Main process exited, code=exited, status=1/FAILURE
Aug 12 14:02:30 fv-az41-871 systemd[1]: snap.edgexfoundry.core-command.service: Failed with result 'exit-code'.
Aug 12 14:02:30 fv-az41-871 systemd[1]: snap.edgexfoundry.core-command.service: Scheduled restart job, restart counter is at 9.
Aug 12 14:02:30 fv-az41-871 systemd[1]: Stopped Service for snap application edgexfoundry.core-command.
Aug 12 14:02:30 fv-az41-871 systemd[1]: snap.edgexfoundry.core-command.service: Start request repeated too quickly.
Aug 12 14:02:30 fv-az41-871 systemd[1]: snap.edgexfoundry.core-command.service: Failed with result 'exit-code'.
Aug 12 14:02:30 fv-az41-871 systemd[1]: Failed to start Service for snap application edgexfoundry.core-command.
Example test result and logs:
- https://github.com/canonical/edgex-snap-testing/runs/7823679398?check_suite_focus=true
- device-rfid-llrp-logs.zip
Related issue in tests: #79, where test port 33333 is not available.
Platform test setting the port of all services to the same value
edgex-snap-testing/test/suites/edgexfoundry/main_test.go
Lines 72 to 73 in d61a564
These should be set to false or removed in favor of another custom test that doesn't mess with a port globally.
Update documentation of snap testing workflow
Update diagram and add explanation.
Service fails to start when core component is not ready
Logs (from here):
2022-04-02T17:28:02Z edgex-device-mqtt.device-mqtt[5671]: level=INFO ts=2022-04-02T17:28:02.553070694Z app=device-mqtt source=messaging.go:69 msg="Setting options for secure MessageBus with AuthMode='usernamepassword' and SecretName='redisdb"
2022-04-02T17:28:02Z edgex-device-mqtt.device-mqtt[5671]: level=INFO ts=2022-04-02T17:28:02.565105083Z app=device-mqtt source=messaging.go:97 msg="Connected to redis Message Bus @ redis://localhost:6379 publishing on 'edgex/events/device' prefix topic with AuthMode='usernamepassword'"
2022-04-02T17:28:02Z edgex-device-mqtt.device-mqtt[5671]: level=INFO ts=2022-04-02T17:28:02.565248388Z app=device-mqtt source=init.go:152 msg="Check core-metadata service's status via Registry..."
2022-04-02T17:28:02Z edgex-device-mqtt.device-mqtt[5671]: level=ERROR ts=2022-04-02T17:28:02.568653798Z app=device-mqtt source=init.go:161 msg="core-metadata service is not registered. Might not have started... "
2022-04-02T17:28:03Z systemd[1]: Stopping Service for snap application edgex-device-mqtt.device-mqtt...
We may need to extend the startup duration and interval: Common Environment Variables - EdgeX Foundry Documentation
Alternatively, we change the tests to wait for the required services before kicking off the tests.
Remove manual enable `app-options` once device-virtual's configure hook is available
Remove this line once device-virtual's configure hook with enabling app-options
by default is available in the latest/edge channel.
Refactor suites to use predefined ports from utils package
The port numbers are set in different suites but also in the utils package.
It would be cleaner to simply use the ports set in the utils package.
For example, the port for Device Virtual can be retrieved with utils.ServicePort("device-virtual")
.
We may want to also add constants for the service names to avoid human errors.
Rename `DisableConfigProviderXXX` function for clarity
Suggestion for future work: the newly added functions DisableConfigProviderXXX
don't actually disable the config provider. They just configure services to not use it and also to load common config from a file. For clarity, I'd call the action disuse rather than disable.
Originally posted by @farshidtz in #175 (comment)
Allow passing full config test option to the test action
It is currently possible to pass it only by an environment variable, when testing locally:
edgex-snap-testing/test/utils/env.go
Lines 38 to 44 in fcd02ae
Add secret config test to add API gateway user
Call version 3 of API on behalf of example user
App service configurable profile config test prints all service logs
The test searches for the profile using Go string matching functions but as a side effect all the logs are printed. This is because tests run with verbosity and the output of the snap logs command is printed out.
We should implement a new function which fetches logs and uses grep to search for the expected string.
Upgrade and enable secrets-config proxy tests
The tests have been disabled by #160 to make way for the new implementation:
This also depends on:
Add manual testing workflow with local build
- Add a boolean input to
workflow_dispatch
calledbuild_locally
to https://github.com/canonical/edgex-snap-testing/blob/main/.github/workflows/snap-testing.yml - Add repo addresses to the matrix.
- Add a build step which runs when
build_locally
is set. - Pass the snap name to test action (we had it before: )
Dependency Dashboard
This issue lists Renovate updates and detected dependencies. Read the Dependency Dashboard docs to learn more.
Open
These updates have all been created already. Click a checkbox below to force a retry/rebase of any.
- fix(deps): update module github.com/stretchr/testify to v1.8.4
- chore(deps): update actions/checkout action to v4
Detected dependencies
github-actions
.github/workflows/config-provider-testing.yml
actions/checkout v3
actions/checkout v3
.github/workflows/issues-to-jira.yml
.github/workflows/snap-testing.yml
actions/checkout v3
actions/checkout v3
.github/workflows/unit-testing.yml
actions/checkout v3
actions/setup-go v4
.github/workflows/versioning.yml
Actions-R-Us/actions-tagger v2.0.3
build/action.yml
actions/checkout v3
snapcore/action-build v1
actions/upload-artifact v3
gomod
go.mod
go 1.17
github.com/stretchr/testify v1.8.3
- Check this box to trigger a request for Renovate to run again on this repository
Reference port 33333 used by postgres
=== RUN TestCommon/config/change_service_port/global_config
log.go:15: [exec] sudo snap set edgex-device-usb-camera app-options=true
log.go:15: [exec] sudo lsof -nPi :33333 || true
log.go:15: [stdout] COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
log.go:15: [stdout] postgres 4756 snap_daemon 8u IPv6 41544 0t0 UDP [::1]:33333->[::1]:33333
log.go:15: [stdout] postgres 4769 snap_daemon 8u IPv6 41544 0t0 UDP [::1]:33333->[::1]:33333
log.go:15: [stdout] postgres 4770 snap_daemon 8u IPv6 41544 0t0 UDP [::1]:33333->[::1]:33333
log.go:15: [stdout] postgres 4771 snap_daemon 8u IPv6 41544 0t0 UDP [::1]:33333->[::1]:33333
log.go:15: [stdout] postgres 4772 snap_daemon 8u IPv6 41544 0t0 UDP [::1]:33333->[::1]:33333
log.go:15: [stdout] postgres 4773 snap_daemon 8u IPv6 41544 0t0 UDP [::1]:33333->[::1]:33333
log.go:15: [stdout] postgres 4774 snap_daemon 8u IPv6 41544 0t0 UDP [::1]:33333->[::1]:33333
log.go:15: [stdout] postgres 4966 snap_daemon 8u IPv6 41544 0t0 UDP [::1]:33333->[::1]:33333
log.go:15: [stdout] postgres 50[85](https://github.com/canonical/edgex-snap-testing/runs/7177704444?check_suite_focus=true#step:4:87) snap_daemon 8u IPv6 41544 0t0 UDP [::1]:33333->[::1]:33333
log.go:15: [stdout] postgres 52[88](https://github.com/canonical/edgex-snap-testing/runs/7177704444?check_suite_focus=true#step:4:90) snap_daemon 8u IPv6 41544 0t0 UDP [::1]:33333->[::1]:33333
log.go:15: [stdout] postgres 52[89](https://github.com/canonical/edgex-snap-testing/runs/7177704444?check_suite_focus=true#step:4:91) snap_daemon 8u IPv6 41544 0t0 UDP [::1]:33333->[::1]:33333
log.go:15: [stdout] postgres 52[90](https://github.com/canonical/edgex-snap-testing/runs/7177704444?check_suite_focus=true#step:4:92) snap_daemon 8u IPv6 41544 0t0 UDP [::1]:33333->[::1]:33333
log.go:15: [stdout] postgres 5301 snap_daemon 8u IPv6 41544 0t0 UDP [::1]:33333->[::1]:33333
net.go:174: Port 33333 is not available
The RequirePortAvailable
takes this port as input and fail the tests if the port isn't available. Maybe it is better to have a function such as GetAvailablePort
which returns a port that is available.
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.